一,Trace跟蹤參數
-verbose:gc
-XX:+printGC
可以打印GC的簡要信息
[GC 4790K->374K(15872K), 0.0001606 secs]
[GC 4790K->374K(15872K), 0.0001474 secs]
[GC 4790K->374K(15872K), 0.0001563 secs]
[GC 4790K->374K(15872K), 0.0001682 secs]
-XX:+PrintGCDetails
打印GC詳細信息
-XX:+PrintGCTimeStamps
打印CG發生的時間戳
例
[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
- Xloggc:log/gc.log
指 定GC log的位置,以文件輸出
幫助開發人員分析問題
- 每次一次GC後,都打印堆信息
-XX:+TraceClassLoading
監控類的加載
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
-XX:+PrintClassHistogram
–按下Ctrl+Break後,打印類的信息:
–分別顯示:序號、實例數量、總大小、類型
二,堆的分配參數
-Xmx –Xms
指定最大堆和最小堆
-Xmn
設置新生代大小
-XX:NewRatio
新生代(eden+2*s)和老年代(不包含永久區)的比值
4 表示 新生代:老年代=1:4,即年輕代佔堆的1/5
-XX:SurvivorRatio
設置兩個Survivor區和eden的比
8表示 兩個Survivor :eden=2:8,即一個Survivor佔年輕代的1/10
例1: -Xmx20m -Xms20m -Xmn1m -XX:+PrintGCDetails
例2:
-Xmx20m -Xms20m -Xmn15m -XX:+PrintGCDetails
1.沒有觸發GC
2.全部分配在eden
3.老年代沒有使用
例3:
-Xmx20m -Xms20m –Xmn7m-XX:+PrintGCDetails
1.進行了2次新生代GC
2.s0 s1 太小需要老年代擔保
例4:
-Xmx20m -Xms20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails
例5:
-Xmx20m -Xms20m -XX:NewRatio=1
-XX:SurvivorRatio=3 -XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError
OOM時導出堆到文件
-XX:+HeapDumpPath
導出OOM的路徑
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
Vector v=new Vector();
for(int i=0;i<25;i++)
v.add(new byte[1*1024*1024]);
-XX:OnOutOfMemoryError
在OOM時,執行一個腳本
"-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p“
當程序OOM時,在D:/a.txt中將會生成線程的dump
可 以在OOM時,發送郵件,甚至是重啓程序
總結:
根據實際事情調整新生代和倖存代的大小
官方推薦新生代佔堆的3/8
倖存代佔新生代的1/10
在OOM時,記得Dump出堆,確保可以排查現場問題
永久區參數分配:
-XX:PermSize -XX:MaxPermSize
設置永久區的初始空間和最大空間
他們表示,一個系統可以容納多少個類型
三,棧的分配參數
-Xss
通常只有幾百K
決定了函數調用的深度
每個線程都有獨立的棧空間
局部變量、參數 分配在棧上
示例:棧內存,分配越大,遞歸調用的次數越多(跟函數的局部變量佔用的內存也有關係)