JVM性能分析与故障排查

引言

JVM调优

程序在上线前的测试或运行中有时会出现一些大大小小的JVM问题,比如cpu load过高、请求延迟、tps降低等,甚至出现内存泄漏(每次垃圾收集使用的时间越来越长,垃圾收集频率越来越高,每次垃圾收集清理掉的垃圾数据越来越少)、内存溢出导致系统崩溃,因此需要对JVM进行调优,使得程序在正常运行的前提下,获得更高的用户体验和运行效率。

故障排查

在Java应用中,系统内存通常会被分为几块不同的空间,了解这些不同内存区域的作用有助于更好地编写Java应用,构建更加稳定的系统。而堆空间更是Java内存中最为重要的区域,几乎所有的应用程序对象都在堆中分配,当系统出现故障时,具备Java堆的内存分析能力,也可以更加方便地诊断系统的故障。

常用分析工具

查看Java进程

jps jcmd 或linux系统命令ps -ef | grep java
查看进程详细信息 jinfo pid

[root@amyiot-local-dev test]# jps
23579 Jps
23327 jar

[root@amyiot-local-dev test]# ps -ef | grep java
root     23327     1  4 5月17 ?       00:59:35 java -server -Xms4096m -Xmx4096m -XX:+UseG1GC -Dspring.profiles.active=test -jar xxx.jar --server.port=8010
root     24834 19825  0 14:07 pts/0    00:00:00 grep --color=auto java

##查看进程详细(运行jps后)
jinfo pid

##查看启动参数
jinfo -flags pid

##查看指定参数值
jinfo -flag InitialHeapSize pid

##查看系统属性
jinfo -sysprops pid

查看进程GC情况

jstat

##查看进程pid的情况
jstat -gc pid

##每5秒输出一次
jstat -gc pid 5000

##每5秒输出一次,输出3次
jstat -gc pid 5000 3

##查看GC统计信息,每秒输出一次
jstat -gcutil pid 1000

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 100.00 99.94 90.56 87.86 875 9.307 3223 5313.139 5322.446
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:Eden Space(伊甸园)区使用比例
O:Old Gen(老年代)使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间


##最近一次gc原因
jstat -gccause pid

##查看gc容量
jstat -gccapacity pid

查看内存堆使用情况

##堆内存各区域使用情况
jmap -heap 23327

##转存堆文件heapdump.hprof
jmap -dump:format=b,file=heapdump.hprof pid

分析hprof堆信息

Windows:jvisualvm.exe 堆入hprof文件即可
Linux:jhat

jhat heapdump.hprof
##有时候堆文件可能会很大,在启动时会报堆空间不足的错误,
jhat -J-Xmx512M heapdump.hprof

通过http访问

查看类实例数量

查看线程情况

##查看线程详情信息,包括锁,状态,如果存在死锁,会在结果输出最后打印出来
jstack pid

GC日志输出

##打印GCDetails
-XX:+PrintGCDetails
##GC前输出Heap信息
-XX:+PrintHeapAtGC
##打印GC时输出时间戳
-XX:+PrintGCDateStamps
##打印GC时,输出新年代最大年龄
-XX:+PrintTenuringDistribution
##在控制台输出GC情况
-verbose:gc
##日志文件路径
-Xloggc:/home/gc/log/gc.log
##循环文件日志输出,与下面参数搭配使用
-XX:+UseGCLogFileRotation
##几个日志文件循环
-XX:NumberOfGCLogFiles=3
##输出的每个日志文件大小,如果满了,就往下一个文件写
-XX:GCLogFileSize=10K

##当发生OOM时输出dump文件,常用参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprof

示例配置

##10个GC文件,从0开始,第0个文件写了大小100K,就使用下一个1号文件
java -server -Xms500m -Xmx500m -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -Xloggc:/home/test/log/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10K -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -Dspring.profiles.active=test -jar xxxx.jar --server.port=8010

GC日志可视化分析

GC easy:https://gceasy.io/

1.参数配置

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:/temp/gc.log

2.将一段时间内生成的log文件上传至gc easy

posted @ 2021-05-18 18:12  心若向阳花自开  阅读(273)  评论(0编辑  收藏  举报