java - Java 8 JVM 挂起,但在内存不足时不会崩溃/堆转储
问题描述
当内存不足时,运行 Tomcat 8 的 Java 8 在堆转储后永远不会停止。相反,它只是挂起,因为它最大内存。由于广泛的 GC,服务器变得非常缓慢且无响应,因为它慢慢接近最大内存。达到最大值后,JConsole 中的内存图呈扁平线。64 位 linux/java 版本“1.8.0_102”/Tomcat 8.Jconsole
我设置了 -XX:HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath。任何人都知道如何强制堆转储而不是 JVM 进入无响应/非常慢的响应模式?
解决方案
任何人都知道如何强制堆转储而不是 JVM 进入无响应/非常慢的响应模式?
你需要使用-XX:+UseGCOverheadLimit
. 这告诉 GC 在垃圾收集所花费的时间百分比太高时抛出 OOME(或转储堆,如果您已配置)。这应该默认为最近的 JVM 启用……但您可能已禁用它。
您可以调整收集器放弃使用-XX:GCTimeLimit=...
和的“开销”阈值-XX:GCHeapFreeLimit=...
;请参阅https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html
“开销”限制的影响是您的应用程序更早地获得了 GC 失败。希望这可以避免“死亡螺旋”效应,因为 GC 使用越来越多的时间来收集越来越少的实际垃圾。
另一种可能性是您的 JVM 需要很长时间来转储堆。如果真正的问题是您的 JVM 导致虚拟内存抖动,则可能会发生这种情况,因为 Java 的内存使用量明显大于物理内存量。
推荐阅读
- mongoose - Mongoose 在读取/查找时删除不在架构上的字段
- c# - 我有一个有效的滑动检测器脚本,但我不知道如何将它连接到我的角色控制器
- python - 嘿,我的功能不删除任何东西,为什么?
- python - 商业情感词典
- javascript - 等待承诺而不继续执行
- json - 从 Scala 中的 CSV 列中发现类型
- javascript - 如何使用 javascript(Reactjs) 作为前端和 node.js 作为后端创建依赖下拉列表
- python - 我无法导入 data_utils
- sql - 我如何获得重叠值的计数并按最多重叠的百分比排序
- java - 扩展HashMap的java类
> 覆盖方法不工作