JVM监控与故障处理
常用排查命令
# 1.查看gc转态(10次间隔10000ms)
jstat -gcutil pid 10000 10
# 2.查看堆中对象的内存分配(前十名)
jmap --histo:live pid | head 10
# 3.查看内存各项配置
jmap -head pid
# 4.dump堆转储文件
-dump:[live,]format=b,file=<filename> pid
JDK自带工具
名称 | 主要作用 | 备注 |
---|---|---|
jps | 显示虚拟机进程 | |
jstat | 收集虚拟机运行数据 | |
jinfo | 显示虚拟机配置信息 | |
jmap | 生成虚拟机内存转储快照HeadDump文件 | |
jhat | 分析HeadDump文件,生成http服务 | |
jstack | 显示虚拟机线程快照 |
jps:虚拟机进程统计工具
常用参数
-l 输出类的全名,如果是jar,输出路径
-v 输出虚拟机启动时的jvm参数
jstat:虚拟机统计信息监视工具
jstat [option vmid [interval[s|ms [count]]] ]
Option | 主要作用 | 备注 |
---|---|---|
-class | 监视类转载,卸载数量,总空间,类转载所耗费的时间 | |
-gc | 监视Java堆内存,已用空间,GC时间合计 | |
-gccapacity | 主要关注Java各个区域使用到的最大,最小空间 | |
-gcnew | 监视新生代GC | |
-gcnewcapacity | 同上主要关注容量 | |
-gcold | 监视老年代GC状况 | |
-gcoldcapacity | 监视老年代GC状况 | |
-compiler | 输出JIT编译器编译过的代码,耗时信息 | |
-printcompilation | 输出永久代空间 |
eg:
D:\data0>jstat -gcutil 14284 10000 10
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 88.25 68.49 18.78 94.81 92.49 19 0.175 6 0.087 0.262
语义解释:
s0: surivivor_0
s1: surivivor_1
E: Eden
O: Old
M: mata_space
CCS: 压缩使用比例
YGC: young gc 19次
YGCT: young gc 耗时0.175sec
FGC: full gc 6ci
FGCT: full gc 耗时0.087sec
GCT: 总耗时0.262sec
jinfo
jinfo -flag pid
jinfo pid
D:\data0>jinfo -flag MaxHeapSize 12348
-XX:MaxHeapSize=4250927104
jmap
如何拿到转储文件
1.使用-XX:+HeapDumpOnOutOfMemoryError参数,可以让jvm在OOM异常时生成dump
2.使用-XX:+HeapDumpOnCtrlBreak参数,可以使用CTRL+Break生成dump
3.在linux下使用Kill -3命令 吓唬虚拟机,也可以拿到dump
4.**jmap**
常用参数
-dump
生成Java堆转储快照
格式: -dump:[live,]format=b,file=<filename>
-finalizerinfo
显示在F-Queue中等待Finalizer线程执行finalize()的对象,只在unix有效
-heap好用
显示堆详细信息,如使用何种垃圾回收器,参数配置,分代状况,只在unix有效
-histo
显示堆中对象统计信息,包括类,实例数量,合计容量
-permstat
以classLoader为统计口径显示永久代内存状态,只在unix有效(1.8+clstats)
-F
当-dump没有响应,-F可以强制生成dump,只在unix有效
jhat(了解)
提供Port:7000的http服务,查看dump文件
jhat 1.dump.hprof
jstack:堆栈跟踪功能工具
用于生成jvm当前时刻的线程快照(一般称为threaddump或者javacore文件)
线程出现停顿,通过jstack
来查看各个线程的调用堆栈,就可以知道没有响应的线程的状态
Option | 主要作用 | 备注 |
---|---|---|
-F | 当正常的输出的请求不被响应时,强制输出线程堆栈 | |
-l | 除堆栈外,显示关于锁的附加信息 | |
-m | 如果调用了本地方法,显示C/C++的堆栈 |
jdk可视化工具
jconsole
visualvm
是伴随JDK发布的功能最强大的运行监控和故障处理程序
不需要被监控的程序基于特殊的Agent运行,因此它对应用程序的实际性能影响很小,可以直接应用在生产环境中,这是其他JProfile无法比拟到的
排查
1.排查出占用CPU最高的线程
jps -l #得到pid
# -H 显示线程信息 -p 指定pid
top -Hp pid #显示该进程下的所有线程
printf '%x' theadId
2.排查占内存最大的实例
jps -l
# 查看占据内存的前十名
jmap -histo:live pid | head 10