Objectpool与不可变对象

tes*_*sto 1 java objectpool

假设您正在使用一个简单的类,并且对象创建并不重:

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可修改类更快吗?我希望不是.

Ste*_*n C 6

一般来说,不是它不快.如果将JVM配置为使用"吞吐量"GC,则不会尝试回收对象,从而获得更好的性能.如果您"受内存限制"或者GC暂停有问题,则唯一值得考虑的是对象池.(根据世代假设,垃圾收集对象的摊销成本趋于零,因为垃圾与非垃圾的比例增加,特别是如果对象"死亡".

事实上:

  • 如果应用程序是多线程的,那么对象池很可能是并发瓶颈,并且

  • "有效不可变"对象的突变可能需要额外的开销和/或额外的同步.


如果对象创建速率是"每秒大约20个对象",则使用对象池不太可能对性能产生显着影响,即使它产生了改进(我怀疑).

算一算.

  • 如果对象大小为SimpleN个字节,并且您每秒分配M,则可以估计每秒分配的字节数.

  • 如果您的"年轻空间"为Y Mbytes,则需要T秒才能根据分配率触发GC.

  • 如果"年轻空间"GC对于大小为Y的空间采用平均G ms,则可以估计假设可以保存的时间的上限...假设对象池具有零关联开销.

  • 实际节省会更少,因为"零开销"假设是不现实的.

事实上,做一个"年轻空间"系列的时间并不仅仅取决于它的大小.它还取决于需要保留的非垃圾量.(更少的非垃圾保留更好!)这可能使GC开销很难估计.但是,如果您已经编写了没有对象池的应用程序,则可以使用典型工作负载测量应用程序的平均"年轻空间"收集时间,然后将其插入上面的计算中.