JVM调优


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

  目录