HotSpotVMGC的種類
collector種類
GC在HotSpotVM5.0裡有四種:
incremental(sometimescalledtrain)lowpausecollector已被廢棄,不在介紹.
類别 | serialcollector(串行) | parallelcollector(并行) (throughputcollector)---(關注吞吐量) | concurrentcollector(并發) (concurrentlowpausecollector)----(關注響應時間) |
介紹 | 單線程收集器 使用單線程去完成所有的gc工作,沒有線程間的通信,這種方式會相對高效 | 并行收集器 使用多線程的方式,利用多CUP來提高GC的效率 主要以到達一定的吞吐量為目标 | 并發收集器 使用多線程的方式,利用多CUP來提高GC的效率 并發完成大部分工作,使得gcpause短 |
試用場景 | 單處理器機器且沒有pausetime的要求 | 适用于科學技術和背景處理 有中規模/大規模資料集大小的應用且運作在多處理器上,關注吞吐量(throughput) | 适合中規模/大規模資料集大小的應用,應用伺服器,電信領域 關注responsetime,而不是throughput |
使用 | Client模式下預設 可使用 可用-XX:+UseSerialGC強制使用 優點:對server應用沒什麼優點 缺點:慢,不能充分發揮硬體資源 | Server模式下預設 --YGC:PSFGC:ParallelMSC 可用-XX:+UseParallelGC或-XX:+UseParallelOldGC強制指定 --ParallelGC代表FGC為ParallelMSC --ParallelOldGC代表FGC為ParallelCompacting 優點:高效 缺點:當heap變大後,造成的暫停時間會變得比較長 | 可用-XX:+ |
記憶體回收觸發 | YGC eden空間不足 FGC old空間不足 perm空間不足 顯示調用System.gc(),包括RMI等的定時觸發 YGC時的悲觀政策 dumplive的記憶體資訊時(jmap–dump:live) | YGC時的悲觀政策--YGC前&YGC後 | CMSGC 1.oldGen的使用率達到一定的比率預設為92% 2.配置了CMSClassUnloadingEnabled,且PermGen的使用達到一定的比率預設為92% 3.Hotspot自己根據估計決定是否要觸法 4.在配置了ExplictGCInvokesConcurrent的情況下顯示調用了System.gc. FullGC(SerialMSC) promotionfailed或concurrentModeFailure時; |
記憶體回收觸發時發生了什麼 | 清空eden+from中所有noref的對象占用的記憶體 将eden+from中的所有存活的對象copy到to中 在這個過程中一些對象将晉升到old中: --to放不下的 --存活次數超過tenuringthreshold的 重新計算TenuringThreshold; 單線程做以上動作 全程暫停應用 如果配置了CollectGen0First,則先觸發YGC 清空heap中noref的對象,permgen中已經被解除安裝的classloader中加載的class的資訊 | 同serial動作基本相同,不同點: 1.多線程處理 2.YGC的最後不僅重新計算TenuringThreshold,還會重新調整Eden和From的大小 1.如配置了ScavengeBeforeFullGC(預設),則先觸發YGC(??) 2.MSC:清空heap中的noref對象,permgen中已經被解除安裝的classloader中加載的class資訊,并進行壓縮 3.Compacting:清空heap中部分noref的對象,permgen中已經被解除安裝的classloader中加載的class資訊,并進行部分壓縮 多線程做以上動作. | CMSGC: 1.oldgen到達比率時隻清除oldgen中noref的對象所占用的空間 2.permgen到達比率時隻清除已被清除的classloader加載的class資訊 同serial |
細節參數 | -XX:SurvivorRatio=x,控制eden/s0/s1的大小 -XX:MaxTenuringThreshold,用于控制對象在新生代存活的最大次數 -XX:PretenureSizeThreshold=x,控制超過多大的位元組的對象就在old配置設定. | -XX:UseAdaptiveSizePolicy去掉YGC後動态調整edenfrom已經tenuringthreshold的動作 -XX:ParallelGCThreads設定并行的線程數 | -XX:CMSInitiatingOccupancyFraction設定oldgen使用到達多少比率時觸發 -XX:CMSInitiatingPermOccupancyFraction,設定PermGen使用到達多少比率時觸發 -XX:+UseCMSInitiatingOccupancyOnly禁止hostspot自行觸發CMSGC |
注:
- throughputcollector與concurrentlowpausecollector的差別是throughputcollector隻在youngarea使用使用多線程,而concurrentlowpausecollector則在tenuredgeneration也使用多線程。