Answers:
不推荐使用它作为一种通用技术,因为-正如您所注意到的-在现代JVM中,创建和销毁短暂存在的对象本身(即内存分配和GC)非常便宜。因此,与普通的new
。* 对象相比,使用手写的对象池可能更慢,更复杂且更容易出错。
但是,它仍然可以用于创建成本相对较高的特殊对象,例如DB /网络连接,线程等。
* 一旦我不得不提高爬网Java应用程序的性能。调查发现了使用对象池分配数百万个对象的企图...并且编写该对象池的聪明人使用单个全局锁使其线程安全。用普通替换池new
使应用程序速度提高了30倍。
具体问题的答案是:“对象池是否已被弃用?” 是:
否。对象池在特定位置广泛使用-线程池,数据库连接池等。
常规对象创建从来都不是一个缓慢的过程。池本身消耗资源-内存和处理能力。任何优化都是一个权衡。
规则是:
过早的优化是邪恶的!!!
但是给定的优化何时过早?
过早的优化是在通过彻底的概要分析发现瓶颈之前进行的所有优化。
测量
这完全取决于您的用例,对象的大小,JVM,JVM选项,启用的GC以及其他许多因素。
简而言之:先测量,再测量。假设您正在使用对象池框架(例如来自Apache的对象池),那么在实现之间进行交换应该不会太麻烦。
额外的性能测试技巧-让JVM先进行预热,在运行的JVM上运行测试多次,它的行为可能会有所不同。
该池实际上使程序性能变差,尤其是在并发应用程序中,并且建议实例化新对象,因为在较新的JVM中,对象的实例化确实非常快。
取决于上下文。
我不知道这里是否有变化的趋势,但是肯定会取决于它的情况。如果您的Java类正在管理外部资源(例如RMI连接或加载资源文件等),则对象实例化的成本肯定仍然很高(尽管这些资源可能已经为您汇集了!)。作为一般惯例,我会同意这本书。