我有一个Java类,它执行以下操作:
public void slowsDownOverTime() {
for (int i=0 ; i<nIter ; i++) {
BigObject bigObject = new BigObject();
// some code here that populates big object ...
CustomSerializer.write(bigObject);
}
}
我观察到的是,随着代码的迭代,串行器写入所需的时间越来越长。启动时,序列化程序以毫秒为单位运行;经过数万次迭代后,需要几秒钟来运行。
序列化器写入的磁盘几乎不会满,并且发生这种情况时,正在使用的Java堆空间也不会接近其最大值。
在这种情况下,我尽可能地减少了创建和销毁的对象的数量和大小。从根本上讲,我的工具包已经耗尽,无法解决此类问题!
我对如何理解和纠正性能逐渐下降的任何建议将不胜感激!
最佳答案
我认为,这是由遗漏的代码(此处填充大对象的某些代码)引起的。试试这个:
public void slowsDownOverTime() {
BigObject bigObject = new BigObject();
// some code here that populates big object ...
for (int i=0 ; i<nIter ; i++) {
CustomSerializer.write(bigObject);
}
}
这将始终写入同一对象,我希望这不会降低性能。
我认为遗漏的代码会建立一个不断增长的数据结构,
bigObject
会引用该数据结构。请记住,在进行序列化时,Java会遍历所有依赖对象到最深处,并对所有依赖对象也进行序列化。因此,每次迭代它将写入越来越多的数据。这可能是性能下降和占用大量磁盘空间的原因。