为进程生成堆转储,但进程未崩溃。生成堆转储的原因可能是什么?我们如何识别它?
下面是 jvm 参数。 -XX:CompressedClassSpaceSize=528482304 -XX:+HeapDumpOnOutOfMemoryError -XX:InitialHeapSize=1977595776 -XX:MaxHeapSize=4294967296 -XX:MaxMetaspaceSize=536870912 -XX:MetaspaceSize=268435456 -XX:+PrintGC -XX:+PrintGCDate邮票-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UsePerfData -XX:+UseStringDeduplication
我们需要确定为什么在没有 OOM 的情况下生成堆转储?
为进程生成堆转储,但进程未崩溃
您的 JVM 参数中没有 -XX:+ExitOnOutOfMemoryError。因此,不能保证 JVM 在 OOM 时会崩溃。
有时 JVM 可能会在 OOM 中幸存下来,生成堆转储,但进程不会崩溃。我发现这会导致一些不可预测的问题。所以,在我看来,在 OOM 的情况下重新启动 JVM 总是好的。
产生堆转储的原因可能是什么以及我们如何识别它?
不幸的是,仅仅从两个 GC 分析快照来看,没有人能告诉你这一点。请通过 Eclipse MAT 等工具分析从 OOM 生成的堆转储。您将从中获得可靠的信息。
有趣的是,堆转储是在没有进程崩溃或 OutOfMemoryError 的情况下生成的。这可能表明存在手动触发或未导致完全崩溃的微妙内存问题。分析 GC 日志和堆转储可以帮助识别根本原因。与潜在客户开发机构仔细检查数据以优化潜在客户流的方式类似,深入研究这些细节可以为您的应用程序的内存行为提供有价值的见解