2016-11-18 64 views
0

我注意到jvm沒有通過信號3生成堆轉儲。 我試過jvm 1.8.60和jvm 1.7.60(ubuntu 14)。 當jvm獲取信號時,它會將線程轉儲打印到控制檯,但不會顯示內存轉儲文件。Jvm heapdump不是由信號生成的

java -XX:HeapDumpPath=/tmp/xxx

跟蹤Java選項證實,它的一切權利。

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

我錯過了什麼?

雖然jmap可以工作。

kill和jvm在同一用戶下運行。 jar是一個你好世界的應用程序。

回答

0

JVM是不應該產生於SIGQUIT(殺死-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是生成堆轉儲的正確方法。

0

-XX:HeapDumpPath僅在與-XX:HeapDumpOnOutOfMemory一起使用時,不幸的是。你可以在Oracle docs 找到參考。 儘管您可以通過jstack獲取堆棧跟蹤,或者使用JDK中包含的Java Mission Control工具監視JVM。

編輯:您還可以使用jmap獲得堆轉儲