Jvm堆转储不是由信号生成的



我注意到jvm没有在信号3时生成堆转储。我尝试了jvm 1.8.60和jvm 1.7.60 (ubuntu 14)。当jvm收到信号时,它打印线程转储到控制台,但内存转储文件没有出现。

java -XX:HeapDumpPath=/tmp/xxx

跟踪java选项确认一切正常

bool PrintHeapAtSIGBREAK = true {product}
ccstr HeapDumpPath := /tmp/xxx {manageable}

我错过了什么?

jmap可以工作。

kill和JVM在同一用户下运行。Jar是一个hello world应用。

JVM不应该在SIGQUIT (kill -3)时生成堆转储。

PrintHeapAtSIGBREAK的含义不同。它打印堆布局摘要,例如

Heap
 PSYoungGen      total 75264K, used 3870K [0x000000076c600000, 0x0000000771a00000, 0x00000007c0000000)
  eden space 64512K, 6% used [0x000000076c600000,0x000000076c9c7b68,0x0000000770500000)
  from space 10752K, 0% used [0x0000000770f80000,0x0000000770f80000,0x0000000771a00000)
  to   space 10752K, 0% used [0x0000000770500000,0x0000000770500000,0x0000000770f80000)
 ParOldGen       total 172032K, used 0K [0x00000006c5200000, 0x00000006cfa00000, 0x000000076c600000)
  object space 172032K, 0% used [0x00000006c5200000,0x00000006c5200000,0x00000006cfa00000)
 Metaspace       used 2471K, capacity 4486K, committed 4864K, reserved 1056768K
  class space    used 267K, capacity 386K, committed 512K, reserved 1048576K

jmap是生成堆转储的正确方式。

-XX:HeapDumpPath只适用于-XX:HeapDumpOnOutOfMemory,不幸的是。您可以在Oracle文档中找到相关参考。您可以通过jstack获得堆栈跟踪,也可以使用JDK中包含的Java Mission Control工具监视JVM。

编辑:您也可以使用jmap获取堆转储

最新更新