collector種類
GC在 HotSpot VM 5.0裏有四種:
incremental (sometimes called train) low pause collector已被廢棄,不在介紹.
類別 | serial collector | parallel collector ( throughput collector ) |
concurrent collector (concurrent low pause collector) |
介紹 |
單線程收集器 |
並行收集器 |
併發收集器 |
試用場景 | 單處理器機器且沒有pause time的要求 |
適用於科學技術和後臺處理 |
適合中規模/大規模數據集大小的應用,應用服務器,電信領域 |
使用 | Client模式下默認 可使用 可用-XX:+UseSerialGC強制使用 優點:對server應用沒什麼優點 缺點:慢,不能充分發揮硬件資源 |
Server模式下默認 --YGC:PS FGC:Parallel MSC 可用-XX:+UseParallelGC或-XX:+UseParallelOldGC強制指定 --ParallelGC代表FGC爲Parallel MSC --ParallelOldGC代表FGC爲Parallel Compacting 優點:高效 缺點:當heap變大後,造成的暫停時間會變得比較長 |
可用-XX:+UseConcMarkSweepGC強制指定 |
內存回收觸發 | YGC eden空間不足 FGC old空間不足 perm空間不足 顯示調用System.gc() ,包括RMI等的定時觸發 YGC時的悲觀策略 dump live的內存信息時(jmap –dump:live) |
YGC eden空間不足 FGC old空間不足 perm空間不足 顯示調用System.gc() ,包括RMI等的定時觸發 YGC時的悲觀策略--YGC前&YGC後 dump live的內存信息時(jmap –dump:live) |
YGC eden空間不足 CMS GC 1.old Gen的使用率大的一定的比率 默認爲92% 2.配置了CMSClassUnloadingEnabled,且Perm Gen的使用達到一定的比率 默認爲92% 3.Hotspot自己根據估計決定是否要觸法 4.在配置了ExplictGCInvokesConcurrent的情況下顯示調用了System.gc. Full GC(Serial MSC) promotion failed 或 concurrent Mode Failure時; |
內存回收觸發時發生了什麼 | YGC 清空eden+from中所有no ref的對象佔用的內存 將eden+from中的所有存活的對象copy到to中 在這個過程中一些對象將晉升到old中: --to放不下的 --存活次數超過tenuring threshold的 重新計算Tenuring Threshold; 單線程做以上動作 全程暫停應用 FGC 如果配置了CollectGen0First,則先觸發YGC 清空heap中no ref的對象,permgen中已經被卸載的classloader中加載的class的信息 單線程做以上動作 全程暫停應用 |
YGC 同serial動作基本相同,不同點: 1.多線程處理 2.YGC的最後不僅重新計算Tenuring Threshold,還會重新調整Eden和From的大小 FGC 1.如配置了ScavengeBeforeFullGC(默認),則先觸發YGC(??) 2.MSC:清空heap中的no ref對象,permgen中已經被卸載的classloader中加載的class信息,並進行壓縮 3.Compacting:清空heap中部分no ref的對象,permgen中已經被卸載的classloader中加載的class信息,並進行部分壓縮 多線程做以上動作. |
YGC 同serial動作基本相同,不同點: 1.多線程處理 CMSGC: 1.old gen到達比率時只清除old gen中no ref的對象所佔用的空間 2.perm gen到達比率時只清除已被清除的classloader加載的class信息 FGC 同serial |
細節參數 | 可用-XX:+UseSerialGC強制使用 -XX:SurvivorRatio=x,控制eden/s0/s1的大小 -XX:MaxTenuringThreshold,用於控制對象在新生代存活的最大次數 -XX:PretenureSizeThreshold=x,控制超過多大的字節的對象就在old分配. |
-XX:SurvivorRatio=x,控制eden/s0/s1的大小 -XX:MaxTenuringThreshold,用於控制對象在新生代存活的最大次數 -XX:UseAdaptiveSizePolicy 去掉YGC後動態調整eden from已經tenuringthreshold的動作 -XX:ParallelGCThreads 設置並行的線程數 |
-XX:CMSInitiatingOccupancyFraction 設置old gen使用到達多少比率時觸發 -XX:CMSInitiatingPermOccupancyFraction,設置Perm Gen使用到達多少比率時觸發 -XX:+UseCMSInitiatingOccupancyOnly禁止hostspot自行觸發CMS GC |
注:
- throughput collector與concurrent low pause collector的區別是throughput collector只在young area使用使用多線程,而concurrent low pause collector則在tenured generation也使用多線程。
- 根據官方文檔,他們倆個需要在多CPU的情況下,才能發揮作用。在一個CPU的情況下,會不如默認的serial collector,因爲線程管理需要耗費CPU資源。而在兩個CPU的情況下,也提高不大。只是在更多CPU的情況下,纔會有所提高。當然 concurrent low pause collector有一種模式可以在CPU較少的機器上,提供儘可能少的停頓的模式,見CMS GC Incremental mode。
- 當要使用throughput collector時,在java opt里加上-XX:+UseParallelGC,啓動throughput collector收集。也可加上-XX:ParallelGCThreads=<desired number>來改變線程數。還有兩個參數 -XX:MaxGCPauseMillis=<nnn>和 -XX:GCTimeRatio=<nnn>,MaxGCPauseMillis=<nnn>用來控制最大暫停時間,而-XX: GCTimeRatio可以提高GC說佔CPU的比,以最大話的減小heap。