JVM之JDK命令行工具

送分小仙女□ 提交于 2021-01-04 03:37:07

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日志分析

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!