JVM调优
Jmap
- 查看内存信息,实例个数及内存占用大小
jmap -histo 13441 > ./jamp.txt(线程 jps可查看)
- 查看堆信息
jmap -heap 13441
- 导出堆内存dump文件,记录当时堆里的对象信息(可以导入到可视化工具里面jvisualvm)
jmap -dump:format=b,file=test.hprof 13441 # 可以设置内存溢出自动导出dump文件(内存很大的时候可能不行) -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
Jstack
- 查看线程堆栈情况,查找死锁
jstack 13441
- Jstack找出CPU最高的线程堆栈信息
top -p pid 显示java进程内存情况 按 H,获取每个线程的内存情况 找到CPU占用最高的那个线程ID 转为16进制,到jstack找到这个线程,以及其调用的方法 jstack 13441 | grep -A 10 3481 // 得到这个线程后面10行的信息
Jinfo
- 查看Java程序扩展参数
- 查看JVM参数
jinfo -flags 13441
- 查看java系统参数
jinfo -sysprops 13441
Jstat
- 查看堆内存各部分使用量,以及类加载数量
- 垃圾回收统计
jstat -gc 13441 - S0C:S0区大小单位KB - S1C:S1区大小 - S0U:S0使用大小 - S1U:S1使用大小 - EC:Eden大小 - EU:Eden使用大小 - OC:老年代大小 - OU:老年代使用 - MC:方法区大小(元空间) - MU:方法区使用 - YGC:minorGC从启动开始次数 - YGCT:minorGC总共花费时间秒(从启动开始) - FGC:FullGC从启动开始次数 - FGCT:FullGC总共花费时间秒(从启动开始) - GCT:总GC时间 # 间隔1S,执行5次 jstat -gc 13441 1000 5
- 相关命令
# 堆内存统计 jstat -gccapacity 13441 # 新生代内存统计 jstat -gcnewcapacity 13441 # 老年代垃圾回收统计 jstat -gcold 13441 # 元空间统计 jstat -gcmetacapacity 13441
估计JVM运行状态
根据jstat -gc 和 jvm堆 配置参数 计算相关数据预估值
- Eden每秒增加多少对象
- 每次minorGC有多少存活对象
- 老年代每秒增加多少对象
优化目标: - 大多数对象都是来得快,去得也快,尽量不要让它们进入老年代
- 尽量让minorGC存活对象<Survivor区50%,让它们留在年轻代,避免频繁FullGC
Arthas
线上监控诊断产品,全局视角实时查看应用 load、内存、gc、线程的状态信息
java -jar arthas-boot.jar
dashboard //展示当前进程的信息
thread //查看线程
jad com.test.zzz.User //反编译
ognl @com.test.zzz.User@hashMap //查看变量值
ognl '@com.test.zzz.User@hashMap.add("test") //动态改变值
GC日志
打印GC日志
java -jar -Xloggc:./gc-%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M test.jar
JVM配置参数
# 打印所有JVM参数选项以及默认值
java -XX:+PrintFlagsInitial
# 打印所有参数选项在运行程序时生效的值
java -XX:+PrintFlagsFinal