常见 JVM dump 指令

2020-10-20

1、查看 Java 进程

 jps

 

2、jrockit dump 操作

jrcmd <pid> hprofdump filename=/test.hprof

 

3、jstack dump 线程栈信息

jstack <pid> > test.dump
参数:
jstack [-l] <pid>: 连接到一个运行中的进程
jstack -F [-m] [-l] <pid>: 连接到一个挂起的进程
jstack [-m] [-l] <executable> <core>: 连接到核心文件
jstack [-m] [-l] [server_id@]<remote server IP or hostname>: 连接到远程调试服务

 

4、jmap dump 堆内存

jmap [option] <pid>: 连接到正在运行的进程
jmap [option] <executable <core>: 连接到核心文件
jmap [option] [server_id@]<remote server IP or hostname>: 连接到远程调试服务
option:
    无参数: 类似 Solaris pmap,查看虚拟机内存使用情况
        jmap 8888
    -heap: 打印 heap 的概要信息,GC 使用的算法,heap 的配置及 JVM 堆内存的使用情况
        jmap -heap 8888
    -histo[:live]: 打印 Java 堆对象的直方统计信息,live 参数加上只统计活的对象
        jmap -histo:live 8888
    -clstats: 打印类加载器的统计情况
        jmap -clstats 8888
    -finalizerinfo: 打印正等候回收的对象的信息
        jmap -clstats 8888
    -dump:<dump-options>: 使用 hprof 二进制形式,输出 jvm 的 heap 到文件,live 子选项可选只输出活的对象到文件
        jmap -dump:live,format=b,file=heap.bin 8888
    -F: 强制 dump,-dump 和 -histo 的 live 子参数无效
        jmap -heap -F 8888
    -J<flag>: 传递参数到 JVM 运行系统
        jmap -J-Xmx512m 8888

 

5、获取堆信息的 3 种方式

jmap -dump:live,format=b,file=heap.bin 8888

kill -3 <pid>

增加 JVM 启动参数
  -XX:+HeapDumpBeforeFullGC 
  -XX:HeapDumpPath=/dump

 

6、找到占用 CPU 过高的线程,分析

top
    定位到占用 CPU 高的进程 PID

top -H -p <pid> 或者 ps -mp <pid> -o THREAD,tid,time | sort -rn
    查看对应进程的哪个线程占用 CPU 过高

printf "%x\n" tid
    将需要的线程 ID 转换为 16 进制

jstack pid > pid.txt
jstack pid |grep tid -A 30
    导出 CPU 占用较高的进程的线程栈,用 16 进制 tid 在 pid.txt 查找;或打印线程的栈信息

 

7、jhat,分析 java 的堆,并启动一个 web server,可以将堆中对象的数量,大小等信息以 html 的形式显示出来,并支持对象查询语言。因占有大量内存,一般不在服务器上执行使用

jhat -J-Xmx512m <heap dump file>
http://ip:7000/,查看 html
执行对象查询语句 Object Query Language:select s from java.lang.String s where s.count > 100


8、jstat,查看堆内存各部分的使用量、垃圾回收、类编译、加载的情况

ConstXiong 备案号:苏ICP备16009629号-3