JDK 内置了许多命令行工具,可用来获取JVM 不同层面的信息;例如:
工具 | 作用 | 场景 |
---|---|---|
jps | 查看当前java进程、传递参数 | 查看PID: jps -l 、查看给jvm传递的参数: jps -l -v |
jstack | 查看java进程内的线程堆栈信息,可用来检测死锁、死循环飙高CPU等。 | 参见:https://my.oschina.net/u/3457546/blog/1930546 |
jmap | 查看堆各区域的使用情况以及配置信息。 | 查看堆配置:jmap -heap PID 、查看堆中存活对象:jmap -histo:live PID |
jinfo | 查看和调整JVM的各项参数配置。 | 查看所有参数:jinfo PID、查看设置过值的参数: jinfo -flags PID 运行过程中动态开启GC日志等 |
jstat | JVM监控工具,Java进程的类加载、垃圾收集、内存使用等信息。 | 每1000毫秒输出一次java的垃圾回收信息,总共10次:jstat -gc -h3 PID 1000 10 |
jcmd | JDK1.7之后的JVM诊断工具,是一个多功能工具,可用于获取进程的性能统计、内存使用、垃圾收集、线程堆栈、JVM 运行时间等信息;可以理解为上面的命令集成版。 |
jps 查看PID以及指定参数
通过jps命令配合相关参数可以查看java进程相关信息
#-l参数用来查看端口号和包名
[root@ahuang target]# jps -l
7539 microservice-eureka-1.0-SNAPSHOT.jar
7540 microservice-basic-1.0-SNAPSHOT.jar
7541 microservice-gateway-1.0-SNAPSHOT.jar
7931 microservice-web-1.0-SNAPSHOT.jar
8011 sun.tools.jps.Jps
#-v参数用来查看具体设置的参数
[root@ahuang target]# jps -lv
7539 microservice-eureka-1.0-SNAPSHOT.jar
7540 microservice-basic-1.0-SNAPSHOT.jar
7541 microservice-gateway-1.0-SNAPSHOT.jar
8042 sun.tools.jps.Jps -Dapplication.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-0.el7_5.x86_64 -Xms8m
7931 microservice-web-1.0-SNAPSHOT.jar -Xms256M -Xmx256M -XX:+PrintGC -XX:+PrintGCDetails -Xloggc:gc.log
jstack定位代码问题
这里简单描述一下一个CPU飙高的代码问题定位,具体过程可以看另一篇: 线上问题排查
# step1:top查看cpu占用
#step2:查看进程详细信息
ps -aef|grep PID
#step3:查看进程对应的线程
top -p PID -H
#step4:在step3中找到cpu占用过高的线程,通过线程ID转换为16进制得到线程标记
printf "%x\n" 线程ID
#step5:jstack上场定位代码(注意jstack -l后面跟的是进程ID,grep -A 50 读取的是根据线程标记匹配项的后50条输出)
jstack -l 26068 |grep -A 50 65f3
Jmap查看堆信息
查看堆配置:jmap -heap PID
查看堆中存活对象:jmap -histo:live PID
在线上问题排查-内存占用情况排查部分,会使用到jmap命令查看对象存活:线上问题排查 。 下一篇会讲述堆信息具体配置信息的含义。
jinfo查看java进程参数
查看某个
# jinfo -flag 参数名称 PID;例如:
jinfo -flag UseAdaptiveSizePolicy PID
查看配置参数
运行一个spring boot程序,默认不设置任何配置项;通过jinfo查看spring boot的默认配置;
#运行
nohup java -jar microsoft-web.jar &
#查看
[root@ahuang ~]# jinfo -flags 11467
Attaching to process ID 11467, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=130023424 -XX:MaxHeapSize=2051014656 -XX:MaxNewSize=683671552
-XX:MinHeapDeltaBytes=524288 -XX:NewSize=42991616 -XX:OldSize=87031808 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
参数说明
InitialHeapSize 等价于Xms,表示Heap的初始化大小
MaxHeapSize 等价于Xmx,参考Heap中参数说明
MaxNewSize 参考Heap中参数说明
MinHeapDeltaBytes 每次扩展堆的时候最小增长
NewSize 参考Heap中参数说明
OldSize 参考Heap中参数说明
UseParallelGC 此配置仅对年轻代有效,表垃圾收集器为并行收集器
UseCompressedClassPointers、UseCompressedOops
这两个参数有依赖关系,开启前者后者也会开启,开启后者前者也会开启(默认都是开启状态)
这两个参数表示使用32位的偏移量来记录64位对象的指针,旨在节约空间;
具体可参考官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html
jstat
jstat可以用来相关指标的统计,常用的我们会进行垃圾回收的统计
#查看gc统计信息
jstat -gc PID
#或者定时统计,jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
#例如:jstat -gc -h3 PID Time Total;-h指显示几行,time是每隔多少毫秒输出,total是总共统计多少次(不写就一直输出)
jstat -gc -h3 23081 1000 20
具体的GC输出信息,请看另一篇单独的:GC日志分析
来源:oschina
链接:https://my.oschina.net/u/3457546/blog/4653269