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

results matching ""

    No results matching ""