常用的JVM命令
- jps: 查看正在运行的java进程
jsp -l
jps -lv
- jstack: 查看线程堆栈使用情况
# 打印线程状态及堆栈使用情况
jstack -l pid
# 输出堆栈log文件到本地
jstack -l pid > stack.log
# 打印java Native栈信息
jstack -m pid
- jinfo:查看JVM配置参数;动态调JVM参数
- jmap:查看堆使用情况、堆内对象直方图、加载类、生成堆快照等
# 打印 JVM 堆概要信息,包括堆配置、新生代、老生代信息
jmap -heap pid
# 打印类的直方图,也就是各个类实例的个数和空间占用情况
jmap -histo pid
# jmap dump 所有对象在堆中的分布情况
jmap -dump:format=b,file=/Users/fengzheng/jvmlog/jamp_dump.hprof 95463
#加:live 参数 dump 存活对象在队中的分布情况
jmap -dump:live,format=b,file=/Users/fengzheng/jvmlog/jamp_dump.hprof 95463
# Java 类加载器(ClassLoader)信息,包括加载器名称、已加载类个数、占用空间、父加载器、是否存活、类型信息。
jmap -clstats pid
- jstat: 主要用来通过垃圾回收相关信息来判断 JVM 性能问题,也可以查看类加载、编译的情况,主要的用法是通过持续的固定时间间隔的输出来观察。比如每 3 秒打印一次 GC 回收次数,连续打印 10 次,通过动态的变化来观察 GC 是否过于密集。
# 打印 5301 进程下的垃圾回收情况,-h 3 表示每 3 行输出一次标题信息,3s 5 表示每 3s 输出一次,一共输出 5 次
jstat -gcutil -h 3 5301 3s 5
实战JVM问题定位
(1)查询正在运行的java进程列表
jps -l -m
(2)查询进程中CPU使用率较高的线程
top -H -p pid
(3)将线程ID转换为16进制
printf "%x\n" ThreadId
(4)使用Jstack查询线程的堆栈情况
jstack -l PID | grep ThreadId
具体案例
(1)jps -m -l
(2)top -Hp 1754
(3)printf "%x\n" 1773
(4)jstack -l 1754 | grep 6ed -A 20
JVM问题定位步骤
查看堆栈信息 执行步骤:
1. jps
查出程序进程pid
2.top -p <pid> (比如pid:123556)
显示进程的内存情况
3.按H(大写H),获取每个线程的内存情况
4.找到内存和cpu占用最高的线程tid
5.转为十六进制得到 0x4cd0,此为线程id的十六进制表示
6.执行 jstack 123556|grep -A 10 4cd0(步骤5中的0x4cd0,去掉ox),得到线程堆栈信息中 4cd0 从堆栈中看一下那个代码出问题了。
Dump分析
- jvm dump分析的基本思路:
- (1)内存分析;
- (2)线程分析
- (3)gc log分析
- 线程dump分析的基本思路:
- step1:jps查询java 进程id
- step2:使用jstack dump 线程文件,jstack -l processId > thread_dump.txt
- step3:将step2中的dump文件上传至线程分析工具,如:fastThread, Samurai, IBM Thread & Monitor analyzer, Visual VM 等
- 内存dump分析的基本思路:
- step1:jps查询java 进程id
- step2: 使用jmap dump出当前的内存dump文件,jmap -dump:format=b,file=heap.bin
- step3: 将step2中的dump文件上传到dump分析工具(如: Eclipse MAT, HeapHero, JVisualVM)进行分析,
- gc log dump分析
- step1:进程启动时候传递参数
java version8: -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<file-path>
java version9: -Xlog:gc*:file=<file-path>
- step2: 将gc log文件上传至分析工具,如:GCeasy, IBM GC & Memory visualizer, HP JMeter, Google Garbage Cat
基于Arthas的分析(待补充)
Reference
[1] https://dzone.com/articles/what-is-garbage-collection-log-thread-dump-heap-du
[2] jvm参数说明:http://www.51gjie.com/java/551.html