XX:HeapDumpSegmentSize 和 XX:SegmentedHeapDumpThreshold 的用法

Usage of XX:HeapDumpSegmentSize and XX:SegmentedHeapDumpThreshold

我遇到了由于以下消息而导致转储堆失败的问题:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to /usr/local/webapp/logs/java_pid<MY_PID>.hprof ...
Dump file is incomplete: file size limit

我在这里找到了类似的 QA:,但它只是指我们可以用来解决这个问题的选项,而不是如何使用它们。在网上搜索也无济于事,因为关于这些的信息很少。更糟糕的是,我无法轻易测试它们,因为问题很少发生。

我发现我的应用程序达到了它的最大堆大小(8GB)并尝试转储堆,但由于上述错误而失败,转储文件大小只有 2.2GB,这似乎不完整,任何工具(如jhat, jconsole, jvirtualvm) 打不开。

如何使用选项 XX:HeapDumpSegmentSizeXX:SegmentedHeapDumpThreshold 来避免这个问题?

环境

HeapDumpSegmentSizeSegmentedHeapDumpThreshold 是开发人员选项,它们不能在生产 JVM 中更改。这些选项无论如何都不会帮助您,因为它们不是关于将堆转储拆分 到多个文件,而是关于在一个文件 中创建多个段。

确保 ulimit -f 足够大以创建 8G 文件。