一. 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 查看對象佔的字節數