首页 > 解决方案 > Java GC1 不会抛出 OutOfMemory 但一直在挣扎

问题描述

我希望我的应用程序在内存不足的情况下快速失败,因此可以对其进行调整并重新启动进程。我正在运行该服务

-XX:ParallelGCThreads=8

-XX:GCTimeRatio=19

-XX:ConcGCThreads=2

当堆内存耗尽时,GC1 会继续执行 Full Garbage Sweeps,即 STW(Stop the World)事件。它勇敢地战斗,但徒劳无功。jstat -gnew 显示连续 10 次 FGC 尝试未能确保超过 0.03% 的 Olg Den 空间

我查看了 GC1 文档,但我找不到合适的选项来指示 GC1 在它不能从 100 回收超过 0.05% 时抛出 OutOfMemory,比如说 5 次 FGC 尝试。有任何想法吗?谢谢

标签: javaout-of-memoryg1gc

解决方案


无法为何时应抛出 OutOfMemoryException 配置任何阈值。

不幸的是,在 JVM 最终抛出 OutOfMemoryException 之前,当内存运行不足时,通常会出现长时间停止世界暂停的垃圾收集恐慌。

在我对 G1GC 的优化中,该选项-XX:+UseStringDeduplication已被证明非常有价值。效果取决于应用程序创建的字符串数量,例如由编组和解组引起的。

-XX:G1HeapRegionSize采用区域大小 ( )也有助于减少长 GC 中断的数量。尤其是如果 GC 日志在 stop-the-world 事件之前经常显示“to-space耗尽”,则值得调整此选项。

根据我的经验,减少烦人的长时间 GC 暂停的最佳优化是:

  • 向 JVM 添加更多 RAM ;-)
  • 应用程序的内存消耗更少(执行分析会话以查看内存消耗热点)
  • 使用其他垃圾收集器(Shenandoah,Z1)尝试更新的 Java 版本。
  • 当然还可以检测应用程序中的内存泄漏

推荐阅读