JVM调优
2023-11-07 15:04:04 0 举报
AI智能生成
JVM调优工具介绍、使用
作者其他创作
大纲/内容
调优工具
前置条件
启动java应用程序
控制台输入 jps 获取进程 pid
Jmap
JDK自带的工具
jmap -histo pid
查看历史生成的实例
num
序号
instances
实例数量
bates
占用空间大小
class name
类名称
jmap -histo:live pid
查看当前存活的实例,执行过程中可能会触发一次full gc
jmap -heap pid
查看堆信息
jmap -dump:format=b,file=eureka.hprof pid
导出堆内存dump,可以在JVisualVM中导入查看
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./(路径)
Jstack
Jstack pid
查找死锁,也可以使用JVisualVM自动检测死锁
top -p pid
查看进程内存情况
按 shift + h 获取每个线程内存情况
jstack pid | grep -A 10 0x4cd0
得到线程堆栈信息中 0x4cd0(pid转16进制) 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法
Jinfo
查看正在运行的Java应用程序的扩展参数
jinfo -flags pid
查看JVM参数
jinfo -sysprops pid
查看JAVA系统参数
Jstat(常用)
查看堆内存各部分的使用量,以及加载类的数量
命令
jstat -gc pid
查看程序内存使用及GC压力整体情况
jstat -gcutil pid
查看内存使用比例及GC统计
jstat -gccapacity pid
查看堆内存整体情况
jstat -gcnewcapacity pid
查看新生代内存整体情况
jstat -gcoldcapacity pid
查看老年代内存整体情况
jstat -gcnew pid
查看新生代垃圾回收统计
jstat -gcold pid
查看老年代垃圾回收统计
jstat -gcmetacapacity pid
查看元空间整体情况
JVM运行评估
年轻代对象增长速率配置
jstat -gc pid 1000 10
每隔1秒执行1次命令,共执行10次,如果系统负载不高,可以把频率1秒换成1分钟,甚至10分钟来观察整体情况
注意:一般系统可能有高峰期和日常期,所以需要在不同的时间分别估算不同情况下对象增长速率。
Young GC的触发频率
根据年轻代对象增长速率大小预估
Young GC的每次耗时
通过 YGCT/YGC 公式算出
老年代对象增长速率
每次Young GC后进去老年代大概多少对象
Full GC的触发频率
根据l老年代对象增长速率大小预估
Full GC的每次耗时
通过 FGCT/FGC 公式算出
JVisualVM
JDK自带的程序,将内存信息等等做可视化展示
windows
控制台输入 jvisualvm
Arthas(jdk6+)
阿里在2018/9月开源的java诊断工具,采用命令行交互模式,可以方便的定位和诊断线上程序运行问题
官方文档
调优
full gc 比 minor gc 多的原因
元空间不够导致的多余full gc
显示调用System.gc()造成多余的full gc
老年代空间分配担保机制
优化思路
尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象进入老年代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响
方案
通过jstat分析内存以及gc情况,调整堆内存
分析查找代码问题,优化代码
GC日志打印输出
-Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M
%t代表时间
通过分析GC日志,可以获取gc情况,如果full GC过多可进行调整
gceasy
对GC日志文件进行可视化展示的工具,工具还提供基于机器学习的JVM智能优化(需要付费)建议
官网地址
0 条评论
下一页