[速記]Java GC 調教
1. 參數設定參考文件: http://www.tagtraum.com/gcviewer-vmflags.html ,
其它參考文件 http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html ,
http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html ,
http://www.devx.com/Java/Article/21977/1954
2. 輸出 gc 過程: –verbose:gc -Xloggc:<file> [-XX:+PrintGCDetails]
3. 設定memory size, 並不會完全使用完, 如: -XX:NewSize=10m 只有9m左右.
4. minor gc 是收young , major gc 主要是收 tenured. 後者付出的成本很大.
5. 過大的young generation size 會造成 major gc 過度頻繁.
6. 依照不同的需求可以選擇不同的GC(Serial, Parallel, Concurrent , 另外 young/old 可以選擇不同的GC
7. 主要發生major gc的原因是: 1. tenured 空間不足 2. young to tenured 會讓tenured不足
8. 調教 GC 要先做好目標, 如: 在資源不變下減少major gc次數到n時間點幾次.
9. 時間如果夠多, 可以用在major gc 時用 jmap 匯出dump文件, 再用MemoryAnalyzer來看看是那一隻class占用. (一般都是程式沒寫好造成)
10. Java SE 6 Update 14 之後就可以用G1, 待測試中 ...
11. 0.054: [GC 7676K->7444K(31744K), 0.0036754 secs] 0.066: [Full GC 28986K->28948K(31744K), 0.0042119 secs]
11.1 timestamp 0.057 是從程式啟動點開始算
11.2 GC 代表Minor GC , Full GC 代表Major GC
11.3 7676K是已使用 7444K是清理後, (31744K) 是全部記憶體, 再來就是處理的秒數
12. 0.073: [GC 0.073: [DefNew: 7676K->276K(9216K), 0.0135417 secs] 7676K->7444K(31744K), 0.0135808 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
[Full GC 0.123: [Tenured: 21504K->21504K(22528K), 0.0037808 secs] 28948K->28934K(31744K), [Perm : 2935K->2927K(21248K)], 0.0038143 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
12.1 DefNew 代表 young generation , Tenured , Perm 請見下圖
13. gc log 也可用 gcviewer , gclogviewer 看, 它會畫圖提供你參考.
14. heap = young + tenured. 不含 Perm , 當heap 用盡就會收到 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space