假设您正在使用一个简单的类,并且对象创建并不重:
class Simple {
public final int data1;
public final float data2;
...
}
Run Code Online (Sandbox Code Playgroud)
您必须不断将简单对象放入队列:
queue.add(new Simple(123,123f,...));
Run Code Online (Sandbox Code Playgroud)
使用Object-Pool并更改Simple-Class可修改类更快吗?我希望不是.
一般来说,不是它不快.如果将JVM配置为使用"吞吐量"GC,则不会尝试回收对象,从而获得更好的性能.如果您"受内存限制"或者GC暂停有问题,则唯一值得考虑的是对象池.(根据世代假设,垃圾收集对象的摊销成本趋于零,因为垃圾与非垃圾的比例增加,特别是如果对象"死亡".
事实上:
如果应用程序是多线程的,那么对象池很可能是并发瓶颈,并且
"有效不可变"对象的突变可能需要额外的开销和/或额外的同步.
如果对象创建速率是"每秒大约20个对象",则使用对象池不太可能对性能产生显着影响,即使它产生了改进(我怀疑).
算一算.
如果对象大小为SimpleN个字节,并且您每秒分配M,则可以估计每秒分配的字节数.
如果您的"年轻空间"为Y Mbytes,则需要T秒才能根据分配率触发GC.
如果"年轻空间"GC对于大小为Y的空间采用平均G ms,则可以估计假设可以保存的时间的上限...假设对象池具有零关联开销.
实际节省会更少,因为"零开销"假设是不现实的.
事实上,做一个"年轻空间"系列的时间并不仅仅取决于它的大小.它还取决于需要保留的非垃圾量.(更少的非垃圾保留更好!)这可能使GC开销很难估计.但是,如果您已经编写了没有对象池的应用程序,则可以使用典型工作负载测量应用程序的平均"年轻空间"收集时间,然后将其插入上面的计算中.