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