Java垃圾收集器导致性能不佳?需要建议

Shi*_*tya 5 java performance garbage-collection heap-memory

我将简要介绍一下这个问题.我在供应链领域工作,处理物品/产品和SKU.

说,我的整个问题集是100万SKU,我正在运行算法.现在,我的JVM堆大小为4 GB.

我无法一次性处理所有SKU,因为我需要更多的内存.因此,我将问题集分成较小的批次.每批都将包含需要一起处理的所有相关SKU.

现在,我运行几次迭代来处理整个数据集.比如,如果每批保持约.5000 SKU,我将有200次迭代/循环.在批次完成处理之前,需要5000 SKU的所有数据.但是当下一批次开始时,不需要先前的批量数据,因此可以进行垃圾回收.

这是背景问题.现在,由于GC而遇到了特定的性能问题 - 每批需要大约2-3秒才能完成.现在,在这段时间内,GC无法释放任何对象,因为在处理特定批次之前需要所有数据.因此,GC正在将所有这些对象移动到旧Gen(如果我查看yourkit profiler,则有在新的Gen中几乎没有任何东西.因此,旧的增长速度更快,需要完整的GC,这使得我的程序非常慢.有没有办法在这种情况下调整GC,或者可能更改我的代码以不同的方式进行内存分配?

PS - 如果每个批次都很小,我没有看到这个问题.我相信这是因为GC能够快速释放对象,因为批处理完成得更快,因此不需要移动旧代中的对象.

Yos*_*ner 3

第一个 Google 命中表明您可以用来-XX:NewRatio设置相对于旧代更大的新生代大小。