java - 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 尝试。有任何想法吗?谢谢
解决方案
无法为何时应抛出 OutOfMemoryException 配置任何阈值。
不幸的是,在 JVM 最终抛出 OutOfMemoryException 之前,当内存运行不足时,通常会出现长时间停止世界暂停的垃圾收集恐慌。
在我对 G1GC 的优化中,该选项-XX:+UseStringDeduplication
已被证明非常有价值。效果取决于应用程序创建的字符串数量,例如由编组和解组引起的。
-XX:G1HeapRegionSize
采用区域大小 ( )也有助于减少长 GC 中断的数量。尤其是如果 GC 日志在 stop-the-world 事件之前经常显示“to-space耗尽”,则值得调整此选项。
根据我的经验,减少烦人的长时间 GC 暂停的最佳优化是:
- 向 JVM 添加更多 RAM ;-)
- 应用程序的内存消耗更少(执行分析会话以查看内存消耗热点)
- 使用其他垃圾收集器(Shenandoah,Z1)尝试更新的 Java 版本。
- 当然还可以检测应用程序中的内存泄漏
推荐阅读
- javascript - 为什么是 Console.log(name); 在javascript中是空白的?
- node.js - 错误空响应
- c# - ElasticSearch Nest,带有模糊性的边 n gram
- kubernetes-helm - 如何在 helm 图表的模板中使用模板?
- c++ - 无法在 JGrasp 中编译 C++
- javascript - JS 等价于 Python 请求
- javascript - 无法读取未定义的three.js 的属性“几何”
- android - MVVM的正确实现
- deserialization - LiteDb 类反序列化不起作用
- node.js - 将多个 .ts 文件打包成单个 bundle.js 文件