只要不是构造函数里有大量耗时操作(其实真有这玩意儿的话也不应该放到构造函数里,应该通过工厂模式等设计模式去实现),那 ObjectPool 对运行性能确实没有太大提升,但它的主要目的也不是这个,而是在堆上有大量小对象的场景下提升GC 性能(注意加粗的部分,堆上、大量、小对象,这都是很关键的定语)。而且 ObjectPool(对象池)这玩意儿也不是 Netty 才有的,Apache 大礼包下是有 commons-pool(即 org.apache.commons.pool)这个库的。只不过 Netty 为了轻装上阵、减少依赖,所以自己搞了一套。其他很多语言也有类似的概念,比如 C#/.NET 标准库自带的 Microsoft.Extensions.ObjectPool;Android 开发中 NDK 带的 androidx.core.util.Pools;Golang 标准库提供的 sync.pool;等等等等。你会发现这些语言都是带 GC 的。而不带 GC 的语言一般标准库里就不会提供这玩意儿,但面向对象的话一般都会有 Object Pool Pattern(对象池设计模式),这也是个比较常见的设计模式,但一般都是会指线程池、数据库连接池这些(OOP 里万物皆对象);但我们在 Java 里谈及对象池,一般不是指这些,而就是指前面我说的。想看性能评测,网上有很多别人做好的,你可以自行搜索 “Java ObjectPool Benchmark” 关键字来获取相关信息。
只要不是构造函数里有大量耗时操作(其实真有这玩意儿的话也不应该放到构造函数里,应该通过工厂模式等设计模式去实现),那 ObjectPool 对运行性能确实没有太大提升,但它的主要目的也不是这个,而是在堆上有大量小对象的场景下提升GC 性能(注意加粗的部分,堆上、大量、小对象,这都是很关键的定语)。
而且 ObjectPool(对象池)这玩意儿也不是 Netty 才有的,Apache 大礼包下是有 commons-pool(即
org.apache.commons.pool
)这个库的。只不过 Netty 为了轻装上阵、减少依赖,所以自己搞了一套。其他很多语言也有类似的概念,比如 C#/.NET 标准库自带的
Microsoft.Extensions.ObjectPool
;Android 开发中 NDK 带的androidx.core.util.Pools
;Golang 标准库提供的sync.pool
;等等等等。你会发现这些语言都是带 GC 的。而不带 GC 的语言一般标准库里就不会提供这玩意儿,但面向对象的话一般都会有 Object Pool Pattern(对象池设计模式),这也是个比较常见的设计模式,但一般都是会指线程池、数据库连接池这些(OOP 里万物皆对象);但我们在 Java 里谈及对象池,一般不是指这些,而就是指前面我说的。
想看性能评测,网上有很多别人做好的,你可以自行搜索 “Java ObjectPool Benchmark” 关键字来获取相关信息。