JVM垃圾收集器

參考:《實戰Java虛擬機
1 垃圾回收器:串行回收器
特點:串行、獨佔
適用於單核處理器的服務器,Client模式(現在基本都是Server模式)默認使用的垃圾收集器。多核下就不推薦使用了。
回收算法:新生代複製算法,老年代標記壓縮
 
用法:
    -XX:+UseSerialGC        新生代,老年代都用串行回收器
    -XX:+UseParNewGC    新生代ParNew回收器,老年代串行回收器
  -XX:+UseParallelGC    新生代Parallel回收器,老年代串行回收器
 
 
2 垃圾回收器:並行回收器之ParNew
特點:多線程、獨佔
在多核處理器下,性能優於串行處理器,但單核下還不如串行處理器(Serial)
回收算法:標記壓縮
 
用法:
     -XX:+UseParNewGC    新生代ParNew回收器,老年代串行回收器
    -XX:+UseConcMarkSweepGC    新生代ParNew回收器,老年代CMS
    -XX:ParallelGCThreads    回收器線程數量(cpu <= 8) cpu個 : (3 + (5*cpu)/8)
 
3 垃圾回收器:並行回收器之ParallelGC
特點:多線程、獨佔、關注系統吞吐量(即關注垃圾回收總時間)
並行,關注系統吞吐量
回收算法:複製
 
用法:
    -XX:+UseParallelGC    新生代Parallel回收器,老年代串行回收器
    -XX:+UseParallelGC    新生代Parallel回收器,老年代ParallelOld回收器
    -XX:MaxGCPauseMillis    垃圾收集最大停頓時間,設置的小,會導致回收次數變多,垃圾回收總時間變大(吞吐量下降)
    -XX:GCTimeRatio    吞吐量大小(0~100),作用與上面的相反,設置的越大,回收次數越小。
    -XX:+UseAdaptiveSizePolicy    可設置自適應GC策略,系統自動找最大停頓時間與吞吐量的平衡值(真方便,萌新用起來真好)
 
 
4 垃圾回收器:並行回收器之CMS
cms分爲多個階段回收,把標記跟清除的階段分離出來,降低STW的時間(可見初始標記、重新標記是會造成STW)
 
 
特點:多線程、並行(只有初始/重新標記 纔是串行)
並行,關注最小停頓時間
回收算法:標記清除
 
用法:
    -XX:+UseConcMarkSweepGC    新生代ParNew回收器,老年代CMS
    -XX:CMSInitiatingOccupancyFraction    默認68,表示老年代空間使用率=68%時進行CMS回收(設置過小會頻繁回收)
    -XX:+CMSClassUnloadingEnabled    可添加這個參數,cms就會回收perm區的class數據
 
注意點:因爲CMS採用標記清除算法,所以會導致大量內存碎片,CMS解決的辦法是回收幾次後統一處理這些碎片。
 
5 垃圾回收器:並行回收器之G1
多線程、併發的分代回收器,目標是替代CMS,可用於新生代和老年代。相對於CMS,G1處理每次回收都能有效複製對象,減少內存碎片。並且只選取部分進行回收,縮小回收範圍,降低全局停頓帶來的影響。並採用混合回收,優先回收垃圾比例較高的區域。
 
 
特點:多線程、並行(只有初始/重新標記 纔是串行)
並行,關注最小停頓時間
回收算法:標記清除
 
用法:
    -XX:+UseG1GC    新生代G1回收器,老年代G1
 
6 線程本地分配緩存TLAB
TLAB本身佔用了eden區空間,用於給對應線程分配內存。目的就是爲了加速對象分配,對象分配順序如下:
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章