假设您正在使用一个简单的类,并且对象创建并不重:
class Simple {
public final int data1;
public final float data2;
...
}
您必须不断将简单对象放入队列中:
queue.add(new Simple(123,123f,...));
使用Object-Pool并更改Simple-Class可修改类是否更快?我希望不会。
答案 0 :(得分:6)
一般来说,没有它不快。如果将JVM配置为使用"吞吐量" GC,不会尝试回收对象,您将获得更好的性能。如果你是"内存受限,那么只考虑对象池#34;或GC暂停是否有问题。 (垃圾收集对象的摊销成本往往为零,因为垃圾与非垃圾的比例增加,特别是如果对象"年轻人死亡,按照世代假设。)
事实上:
如果应用程序是多线程的,则对象池可能是并发瓶颈,
变异"有效不变的"对象可能需要额外的开销和/或额外的同步。
如果对象创建速率为每秒约20个对象",则使用对象池不太可能对性能产生显着影响,即使它产生了改进(我怀疑)。
算一算。
如果Simple
的对象大小为N个字节,并且您每秒分配M,则可以估计每秒分配的字节数。
如果你的年轻空间"是Y Mbytes,根据分配率触发GC需要T秒。
如果"年轻的空间"对于大小为Y的空间,GC取平均G ms,您可以估计假设保存的时间的上限...假设对象池的关联开销为零。
实际节省的费用会减少,因为零开销"假设是不现实的。
事实上,是时候做一个年轻的空间"集合并不仅仅取决于它的大小。它还取决于需要保留的非垃圾量。 (更少的非垃圾保留更好!)这可能使GC开销很难估计。但是,如果您已经编写了没有对象池的应用程序,则可以测量平均年龄空间"使用典型工作负载为您的应用程序收集时间,然后将其插入上面的计算中。
答案 1 :(得分:1)
如果您真的要创建一些重型对象,或者您有其他需要指定对象池的需求,那么对象池是有意义的。否则,我只需要创建新的并依赖JVM来摆脱所有不需要的东西(只需记住删除/重新分配对不需要的对象的引用)