Day19 JVM调优分析
JVM调优分析
-
jmap 查看内存信息,实例个数以及占用内存大小
▼bash复制代码# 查看java进程信息 jps # 查看当前存活的实例,执行过程中可能会触发一次full gc jmap -histo:live 进程ID > outputDir # 将内存信息输出到文件 # 输出文件内容有四列 # num instances bytes class name # 序号 实例数 占用空间大小 类名称[C=>char[];[S=>short[];[I=>int[];[B=>byte[] # 查看堆信息 JDK9+不再支持 jmap -heap 进程ID # 导出dump文件 jmap -dump:format=b,file=eureka.hprof # JDK9+ jhsdb jmap --binaryheap --dumpfile=heap.hprof --pid 546543dump文件导入到jvisualvm进行分析

-
jstack
-
jstack 获取线程快照,可以寻找死锁,也可以利用jvisualvm自动检测死锁
jstack > fileDir/fileName


-
jstack寻找cpu最高的线程堆栈信息
▼bash复制代码# 查看cpu进程使用情况 top # 查看使用率最高的进程 top -p <pid> # 展开进程里详细的线程占用信息 H # 找到cpu占用率最高的线程,将线程id转化为小写的16进制 # 执行以下命令 pid是十进制进程号,N是显示行数,jpid是十六进制的线程号 jstack <pid> | grep -A N <jpid>

-
-
jinfo
- 查看正在运行的java程序扩展参数

- 查看系统参数

-
jstat jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]
-
查看GC信息 jstat -gc
S0C:第一个幸存区的大小,单位KB; S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小; S1U:第二个幸存区的使用大小
EC:伊甸园区的大小; EU:伊甸园区的使用大小
OC:老年代大小; OU:老年代使用大小
MC:方法区大小(元空间); MU:方法区使用大小
CCSC:压缩类空间大小; CCSU:压缩类空间使用大小
YGC:年轻代垃圾回收次数; YGCT:年轻代垃圾回收消耗时间,单位s
FGC:老年代垃圾回收次数; FGCT:老年代垃圾回收消耗时间,单位s
GCT:垃圾回收消耗总时间,单位s

-
堆内存统计 jstat -gccapacity
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量

-
新生代垃圾回收统计 jstat -gcnew

-
-
诊断工具arthas
- 下载
wget https://alibaba.github.io/arthas/arthas-boot.jar - 启动并分析在运行的进程

dashboard查看进程运行情况

thread查看线程情况(thread <线程id> 查看线程堆栈 thread -b 查看是否有死锁)

jad +全类名 实现反编译

ognl 获取变量(更离谱的,可以改变线上变量值)

- 下载
-
GC日志分析
java -jar -Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M microservice-eureka-server.jar
拿到gc文件后可以上传至gceasy(https://gceasy.io) 进行分析,会输出一个可视化界面查看堆内存及分代使用情况,以及会给出优化建议。















