Mic*_*l P 5 java garbage-collection jvm g1gc java-8
我最近将我的 Java 应用程序从 CMS + ParNew 切换到 G1GC。当我进行切换时,我观察到 CPU 使用率上升,GC 计数 + 暂停时间也上升。切换之前我的 JVM 标志是
java -Xmx22467m -Xms22467m -XX:NewSize=11233m -XX:+UseConcMarkSweepGC -XX:AutoBoxCacheMax=1048576 -jar my-application.jar
Run Code Online (Sandbox Code Playgroud)
切换后我的标志是:
java -Xmx22467m -Xms22467m -XX:+G1GC -XX:AutoBoxCacheMax=1048576 -XX:MaxGCPauseMillis=30 -jar my-application.jar
Run Code Online (Sandbox Code Playgroud)
我遵循了 Oracle 的最佳实践http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
Do not Set Young Generation Size
Run Code Online (Sandbox Code Playgroud)
并且没有设置年轻代的大小。但是我怀疑年轻代的大小是这里的问题。我看到的是堆使用量在 ~6 - 8 GB 之间波动。
而以前,使用 CMS 和 Par New 时,内存使用量在 4-16 GB 之间增长,然后我才看到了 GC:
我不确定我是否理解为什么使用 G1GC 时 GC 如此频繁。在使用 G1GC 进行 GC 调整时,我不确定我缺少什么。
我正在使用 Java 8:ava 版本“1.8.0_144”Java(TM) SE 运行时环境(构建 1.8.0_144-b01)Java HotSpot(TM)64 位服务器 VM(构建 25.144-b01,混合模式)
我感谢您的帮助。
更新:有关这些暂停的更多信息:
正如你所看到的,所有这些暂停都是 G1New,看起来它们和我的目标暂停时间一样长,即 30 毫秒。当我查看切换到 G1GC 之前的 ParNew 暂停时,它是这样的:
所以它们也是年轻代集合(ParNew),但它们的频率较低且较短,因为它们仅在堆使用量达到 14GB 左右时才会发生(根据图表)
我仍然不知道为什么 G1New 发生得这么早(就堆使用而言)
更新 2 我还注意到 NewRatio=2,我不知道 G1GC 是否尊重它,但这意味着我的 New Gen 上限为 7GB。这可能是原因吗?
更新 3 添加 G1GC GC 日志:https ://drive.google.com/file/d/1iWqZCbB-nU6k_0-AQdvb6vaBSYbkQcqn/view?usp = sharing
我发现复制对象所花费的时间非常重要。看起来G1GC在对象升级到Tenured Generation之前默认有15代。我把它减少到 1 ( -XX:MaxTenuringThreshold=1
)
我也不知道如何在日志中确认它,但是通过可视化 GC 日志,我看到年轻代的大小不断调整,从最小大小到最大大小。我缩小了范围,这也提高了性能。
看这里https://docs.oracle.com/javase/9/gctuning/garbage-first-garbage-collector-tuning.htm#JSGCT-GUID-70E3F150-B68E-4787-BBF1-F91315AC9AB9 我试图弄清楚是否粗化确实是一个问题。但它只是说要设置 gc+remset=trace ,我不明白如何在命令行中传递给 java,以及它是否在 JDK 8 中可用。我增加了 XX:G1RSetRegionEntries 以防万一。
我希望它对未来的 G1GC 调音师有所帮助,如果其他人有更多建议那就太好了。
我仍然看到的是,[Processed Buffers] 在年轻疏散中仍然需要很长时间,而 [Scan RS] 在混合集合中很长。不知道为什么
您的 GC 日志显示平均 GC 暂停间隔为 2 秒,每次暂停时间约为 30-40 毫秒,这相当于应用程序吞吐量约为 95%。这并不等于“扼杀性能”的领域。至少不是由于 GC 暂停。
G1 做了更多并发工作,例如,对于记忆集细化,您的暂停似乎在更新/扫描 RS上花费了一些时间,所以我假设并发 GC 线程也很忙,即它可能需要 GC 暂停之外的额外 CPU 周期,这是默认情况下日志未涵盖,您需+G1SummarizeRSetStats
要这样做。如果延迟更重要,您可能需要为机器分配更多内核,如果吞吐量更重要,您可以调整 G1 以在暂停期间执行更多 RS 更新(以增加暂停时间为代价)。
归档时间: |
|
查看次数: |
6979 次 |
最近记录: |