不重启Java 进程,导出dump 文件的方法

CentOS 7.x 扩容 #

2022-05-26 09:27

不重启Java 进程,导出dump 文件的方法 #

首先,查看gc 情况:jstat -gcutil $pid $time

$ jstat -gcutil $pid $time
S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
0.00 100.00  12.91  61.13  96.44  93.83    201   56.754     4   58.699  115.453
0.00 100.00   4.25  51.06  96.44  93.83    202   56.783     4   58.699  115.482
0.00 100.00  10.68  60.63  96.44  93.83    202   56.783     4   58.699  115.482

手动导出当前时点的dump 文件 #

jmap -dump:format=b,file=$dump_file_path $pid

另一种方式:

jcmd $pid GC.heap_dump -all $dump_file_path

在jvm 发生异常时,自动导出dump 文件 #

  1. 查看jinfo 可以调整的参数:java -XX:+PrintFlagsFinal -version|grep manageable

    $ java -XX:+PrintFlagsFinal -version|grep manageable
        ……
        bool HeapDumpAfterFullGC                       = false                               {manageable}
        bool HeapDumpBeforeFullGC                      = false                               {manageable}
        bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
        ccstr HeapDumpPath                              =                                     {manageable}
        ……
    

    主要关注以上几个参数:

    1. FullGC 前导出:HeapDumpBeforeFullGC
    2. FullGC 后导出:HeapDumpAfterFullGC
    3. 发生OutOfMemory 时导出:HeapDumpOnOutOfMemoryError
    4. dump文件保存目录:HeapDumpPath
  2. 设置jvm参数,fullgc前dump 文件:jinfo -flag +HeapDumpBeforeFullGC $pid

  3. 设置dump文件保存目录:jinfo -flag HeapDumpPath=$file_path $pid

  4. 查看jinfo设置的参数值:jinfo -flag $param_name $pid,比如jinfo -flag HeapDumpPath 9846

分析dump 文件 #

使用 MAT 查看分析dump文件,通常使用这两个菜单。

Histogram: Lists number of instances per class
Dominator Tree: List the biggest objects and what they keep alive.