一. JVM的参数类型
1. 标准参数
- -help
- -server -client
- -version -showversion
- -cp -classpath
2. 非标准化参数 (X参数)
- -Xint:解释执行 java -Xint version
- -Xcomp:第一次使用就编译成本地代码 java -Xcomp version
- -Xmixed:混合模式,JVM自己来决定是否编译成本地代码
3. XX参数
- 非标准化参数
- 相对不稳定
- 主要用于JVM调优和Debug
- 参数分类:
- Boolean 类型 格式 -XX:[+-]<name>表示启用或禁用name属性,例如:-XX:+UseG1GC
- 非Boolean类型 格式:-XX:<name>=<value> 表示name的属性值是value,例如-XX:MaxGCPauseMillis=500
- -Xmx -Xms 不是X参数,而是XX参数:-Xms等价于-XX:InitialHeapSize -Xmx等价于-XX:MaxHeapSize
二. 查看JVM运行时参数
1. -XX:+PrintFlagslnitial(可设置参数的初始值) 显示的参数如果是:=则表示是修改过的,=则表示是默认值
2. -XX:PrintFlagsFinal
3. -XX:UnlockExperimentalVMOptions解锁实验参数(先决条件)
4. -XX:+UnlockDiagnosticVMOptions解锁诊断参数
5. -XX:+PrintCommandLineFlags打印命令行参数
6. -Xms -Xmx 堆的容量
7. -XX:NewSize -XX:MaxNewSize 新生代的大小
8. -XX:NewRatio 设置Yong 和 Old的比例
9. -XX:SurvivorRatio 设置两个Survivor区和Eden的比
10. -XX:MetaspaceSize -XX:MaxMetaspaceSize metaspace 大小 (下面的参数都是小弟,主要调整老大即可,容量大了,下面的也会变大)
11. -XX:+UseCompressedClassPointers 使用压缩短指针
12. -XX:CompressedClassSpaceSize 默认1G 可以设置
13. -XX:InitialCodeCacheSize codeCache 最小值
14. -XX:ReservedCodeCacheSize codeCache 最大值
15. -XX:StringTableSize=99991 调整String Pool的大小
16. 查询运行的JVM中的参数
- jinfo -flag MaxHeapSize [pid] 查看最大内存
- jinfo -flags 23789 显示 Non-default VM flags
三. jstat查看JVM统计信息
1. 查看的信息
- 类装载
- 垃圾收集
- JIT编译
2. 命令格式
- jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
- options:-class,-compiler,-gc,-printcompilation
- 垃圾收集 -gc、-gcutil、-gccause、-gcnew、-gcold
- S0C、S1C、S0U、S1U:S0和S1的总量与使用量(S0 和S1 只会启用一个,未启用的会是0)
- EC、EU eden区总量与使用量
- OC、OU:Old区总量与使用量
- MC、MU:Metaspace区总量与使用量
- CCSC、CCSU:压缩类空间总量与使用量
- YGC、YGCT:YoungGC的次数与时间
- FGC、FGCT:FullGC的次数与时间
- GCT:总的GC时间
- JIT编译
- -compiler
- -printcompilation(method compiler)
四. 导出内存映像文件
1. 内存溢出自动导出(内存很大的时候,可能会导不出来)
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=./ (路径)
2. 使用jmap命令手动导出,使用MAT工具分析
- jmap -dump:format=b,file=heap.hprof [pid]
五. MAT分析内存溢出
1. Histogram 查看对象数量
- shallow heap 不包含内部对象字节
- 查看GC root 引用,右键 Merge short path to GC ROOT ==>exclude All xxxx 只看强引用
2. dominator_tree 查看对象占的字节数