调整并行GC以实现高效的Young GC

时间:2018-09-26 16:48:29

标签: java memory-management memory-leaks garbage-collection

此图显示了我们的Java应用程序在4天内的堆利用率(OU + EU + S1U + S2U)。每滴都是年轻GC事件。如您所见,堆使用率在增加。运行6天后会发生完全GC(图表中未显示)。它可以将堆使用率降低到正常水平,但是暂停时间为2分钟,这会导致应用程序丢弃很多事务。

enter image description here

我们的JRE是8,我们使用并行GC。堆参数如下:

 java -server -Xms64g -Xmx64g -XX:MetaspaceSize=96M -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -XX:MaxMetaspaceSize=1g -XX:+UseParallelGC -XX:ParallelGCThreads=4 -XX:+HeapDumpOnOutOfMemoryError -Djava.net.preferIPv4Stack=true -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.zip.disableMemoryMapping=true

我试图了解可以进行哪些调整以提高Young GC的效率,从而消除所有垃圾并避免晋升为终身制。

2 个答案:

答案 0 :(得分:0)

问题似乎是物体被提升到保管空间然后死亡。减少这种情况的一种方法是增大年轻空间,但这只会延迟完整的收藏。

另一种选择可能是减少堆,使其更频繁地收集,从而减少暂停时间。如果使用32GB的堆,则可以使用压缩的oops,从而使内存使用效率更高。

答案 1 :(得分:0)

正如Lawrey先生所指出的,您可以使年轻一代变得更大,这将(希望)增加两次小型GC活动之间的时间。这样,更多的对象将变成垃圾,将被收集在次要GC中,而不会升级为旧的代。另一种方法是增加使用期限阈值,这具有将对象保留在年轻一代中更长的效果。

另一个要问自己的问题是,您真的需要使用并行GC吗?如果使用G1,则收集旧空间的某些工作与应用程序线程同时进行。您可能可以完全消除长暂停(假设您没有遭受过多的堆碎片),因为您不需要完整的压缩集合。

要完全消除停顿,我可以衷心推荐Azul(我为:-)工作的C4收集器)