Ubuntu11.10下編譯 OpenJDK7
http://blog.csdn.net/yhmhappy2006/article/details/7281710
基本垃圾收集演算法 標記-清除(Mark-Sweep)
效率問題
記憶體片段
適用於老年代
複製(Copying)
解決片段問題
可用記憶體縮小(一半)
存活率高時,複製效率低
用於新生代
標記-整理(Mark-Compact)
適用於老年代
老年代存活率高,不適合複製演算法
垃圾收集器
新生代垃圾收集器-基於複製Serial
單線程(暫停使用者線程)
複製
Client模式預設
ParNew
多線程並行(暫停使用者線程)
複製
-XX:+UseParNewGC
預設開啟CPU個數個線程(-XX:ParallelGCThreads)
Server模式下新生代首先(與CMS配合老年代)
Parallel Scavenge
多線程並行(暫停使用者線程)
複製
“輸送量優先”收集器,可精確控制輸送量
輸送量=使用者代碼時間/(使用者代碼時間+垃圾收集時間)
老年代垃圾收集器-基於標記-整理/清除Serial Old
Serial的老年代版本
單線程(暫停使用者線程)
標記-整理
主要在Client模式下使用
在Server下,作為CMS的後備,或與新生代PS收集器配合使用
Parallel Old
Parallel Scavenge老年代版
多線程並行(暫停使用者線程)
標記-整理
From JDK1.6
CMS
適合互連網應用
並發
標記-清除(片段!)
預設線程數:(CPU數量+3)/4
老年代使用了68%後觸發(-XX:CMSInitiatingOccupancyFraction)
CMS步驟
初始標記
並發標記
重新標記
並發清除
其中兩個“並發”步驟是不暫停使用者線程的
記憶體配置回收策略
小對象在Eden區分配
大對象直接在老年代分配
(-XX:PretenureSizeThreshold)
長期存活的對象進入老年代
(-XX:MaxTenuringThreshold)
動態對象年齡判斷
年齡為y的對象個數有n個,如果這n個對象的大小總和大於Survivor空間的一半,則年齡>=y的對象直接進入老年代,無需等到MaxTenuringThreshold
空間分配擔保
相關工具jmap
-heap
查看哪種收集器、分代情況(Linux)
-dump
產生堆快照
-dump:format=b,file=<filename>
-F
強制dump (Linux)
See
http://docs.oracle.com/javase/7/docs/technotes/tools/share/jmap.html
jstat
-class
監視類裝載、卸載數量等
GC
-gc
-gcutil
JIT
……
See
http://docs.oracle.com/javase/7/docs/technotes/tools/share/jstat.html
MAT
Java堆分析器,分析jmap –dump下來的資料,以圖形介面形式展示分析結果
http://www.eclipse.org/mat/