代码之家  ›  专栏  ›  技术社区  ›  Sankalp Gupta

java GC旧一代正在快速填充

  •  1
  • Sankalp Gupta  · 技术社区  · 6 年前

    我有一个问题,我的GC(专业)每隔几个小时运行一次,因为我的很多对象都是从年轻一代转到老一代。
    有人能分析并建议我应该更改什么参数来调整GC吗?
    我的GC配置参数:
    -Xms6144M -Xmx6144M -Xloggc:gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=128K -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/heapdump -XX:SurvivorRatio=4

    以下是GC图:

    enter image description here

    enter image description here

    enter image description here

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  1
  •   Karol Dowbecki    6 年前

    若您关心的是完整GC的持续时间,您可以切换到并发收集器(例如CMS和 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC )并希望完整的GC将不那么频繁。另一种方法是减小总体堆大小,因为完整GC持续时间通常与堆的大小成比例。您每4小时体验一次完整的GC,若您每小时体验一次,但在四分之一的持续时间内,这可能值得一试。

    您可以通过增加新闻大小(例如,直接使用 -XX:NewSize=3g -XX:MaxNewSize=3g )。然而,只有您知道您的应用程序在做什么,分配模式是什么,当前的2g非常慷慨。

    更新到更新的JVM也会有所帮助,例如,作为Java 10的一部分,G1完全并行化(JEP 307)。有一篇关于 Tuning Espresso’s JVM Performance 它将CMS与G1进行比较。