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:HeapDumpSegmentSize
和 XX:SegmentedHeapDumpThreshold
来避免这个问题?
环境
- Java
1.8.0_71
- 似乎相关的选项:
-Xmx8196m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=$LOG_DIR
-XX:OnOutOfMemoryError="kill -9 %p"
HeapDumpSegmentSize
和 SegmentedHeapDumpThreshold
是开发人员选项,它们不能在生产 JVM 中更改。这些选项无论如何都不会帮助您,因为它们不是关于将堆转储拆分 到多个文件,而是关于在一个文件 中创建多个段。
确保 ulimit -f
足够大以创建 8G 文件。
我遇到了由于以下消息而导致转储堆失败的问题:
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:HeapDumpSegmentSize
和 XX:SegmentedHeapDumpThreshold
来避免这个问题?
环境
- Java
1.8.0_71
- 似乎相关的选项:
-Xmx8196m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=$LOG_DIR
-XX:OnOutOfMemoryError="kill -9 %p"
HeapDumpSegmentSize
和 SegmentedHeapDumpThreshold
是开发人员选项,它们不能在生产 JVM 中更改。这些选项无论如何都不会帮助您,因为它们不是关于将堆转储拆分 到多个文件,而是关于在一个文件 中创建多个段。
确保 ulimit -f
足够大以创建 8G 文件。