:新生代串行收集器(默認收集器)
算法復制算法
XX:+UseSerialGC 指定使用新生代串行收集器和老年代串行收集器
優點效率高久經考驗
缺點串行如果回收對象過多或者堆過大停頓時間會過長
:老年代串行收集器(cms收集器的備選)
算法標記壓縮算法
XX:+UseSerialGC:指定新生代串行收集器和老年代串行收集器
XX:+UseParNewGc:新生代使用並行收集器和老年代使用串行收集器
XX:+UseParallelGc:新生代使用並行回收收集器和老年代使用串行收集器
:並行收集器
算法復制算法
工作在新生代的垃圾收集器簡單的將串行回收器多線程化策略和串行一樣也是獨占式的在多cpu環境下會比串行收集器好停頓時間短
XX:+UseParNewGC:新生代使用並行收集器老年代使用串行回收器
XX:+UseConcMarkSweepGC:新生代使用並行收集器老年代使用cms
線程數量
XX:ParallelGCThreads指定一般最好與cpu數量相當cpu小於個時和cpu數量一樣cpu大於個時 +[(*cpu/)]
:新生代並行回收收集器(Parallel Scavenge)
算法復制算法
和並行收集器一樣區別在於這個收集器關注系統吞吐量
XX:+UseParallelGC:新生代使用並行回收收集器老年代使用串行收集器
XX:+UseParallelOldGC:新生代和老年代都使用並行回收收集器
吞吐量設置
XX:MaxGCPauseMillis:設置停頓時間不超過多少大於的整數收集器會調整對的大小或者其他一些參數使得垃圾收集停頓時間控制在設置的時間
XX:GCTimeRatio:設置吞吐量大小~之間的整數 公式/(+n)系統將花費不超過這個時間來用於垃圾收集
XX:useAdaptiveSizePolicy:打開自適應gc策略新生代大小eden和servivor的比例晉升老年代的對象年齡都會自動調整以達到對大小吞吐量和停頓時間之間的平衡
:老年代並行回收收集器
算法標記壓縮算法
和新生代並行回收器一樣它也是一種關注吞吐量的收集器
XX:+UseParallelOldGC:新生代和老年代都使用並行回收收集器
:cms收集器
算法標記清除算法
和並行回收收集器的區別是注重系統停頓時間
工作步驟
初始標記獨占資源
並發標記非獨占資源
重新標記獨占資源
並發清除非獨占資源
並發重置非獨占資源
XX:ParallelGCThreads:設置cms的線程數量默認啟動線程數是(ParallelGCThreads+/)
XX:CMSInitiatingOccupancyFraction:設置當老年代空間實用率達到百分比值時進行一次cms回收
因為使用標記清除算法所以長時間後會有碎片產生
XX:+UseCMSCompactAtFullCollection:設置cms在垃圾收集完成後進行一次內存碎片整理
XX:CMSFullGCsBeforeCompaction:設定進行多少次cms回收後進行一次內存壓縮
應為cms不停止應用程序所以在cms回收過程中可能因為內存不足而導致回收失敗失敗的話會啟動老年代串行收集器進行垃圾回收這樣應用程序將完全中斷這時停頓時間可能會很長可以通過設置XX:CMSInitiatingOccupancyFraction來解決
:G收集器(garbage first) jdkupdate才提供預覽版jdk才發布
總結
在眾多的垃圾回收器中沒有最好的只有最適合應用的回收器根據應用軟件的特性以及硬件平台的特點選擇不同的垃圾回收器才能有效的提高系統性能
jvm調優思路與方法
:將新對象預留在新生代
一般來說當survivor區空間不夠或者占用量達到%時就會將對象進入老年代(不管對象年齡有多大)
:大對象進入老年代
開發中要避免短命的大對象目前沒有特別好的方法回收短命大對象大對象最好直接進入老年區因為大對象在新生區占用空間大會由於空間不足而導致很多小對象進入到老年區
XX:PretenureSizeThreshold:設置大對象直接進入老年代的阈值當對象的大小超過這個值將直接分配在老年代
:設置對象進入老年代 的年齡
XX:MaxTenuringThreshold:設置對象進入老年代的年齡默認值時但是如果空間不夠還是會將對象移到老年代
:穩定與震蕩的堆大小
穩定的堆大小能減少gc次數但是每次gc時間增加
震蕩的堆大小能增加gc次數但是每次gc時間減少
XX:MinHeapFreeRatio:最小空閒比例當堆空間空閒內存小於這個比例則擴展
XX:ManHeapFreeRatio:最大空閒比例當堆空間空閒內存大於這個比例則壓縮
Xms和Xmx相等時上面的參數失效
:吞吐量方案
G內存核吞吐量優先方案盡可能減少系統的執行垃圾回收的總時間考慮使用關注吞吐量的並行回收收集器
Xms:
Xmx:
Xss:k //減少線程棧大小使剩余系統內存支持更多線程
Xmn:g //設置新生代大小
XX:UseParallelGC:新生代並行回收收集器
XX:ParallelGCTHreads:設置線程數
XX:+UseParallelOldGC:老年代也使用並行回收收集器
:使用大頁案例
Xmx:
Xms:
Xss:k //減少線程棧大小使剩余系統內存支持更多線程
XX:UseParallelGC:新生代並行回收收集器
XX:ParallelGCTHreads:
XX:+UseParallelOldGC:老年代也使用並行回收收集器
XX:LargePageSizeInBytes=m
:降低停頓案例
降低停頓首先考慮的是使用關注系統停頓的cms回收器其次為了減少fullgc次數應盡可能將對象預留在新生代因為新生代minorgc的成本遠小於老年代的fullgc
Xms:
Xmx:
Xss:k //減少線程棧大小使剩余系統內存支持更多線程
Xmn:g //設置新生代大小
XX:ParallelGCThreads:
XX:+UseConcMarkSweepGC //老年代使用cms回收器
XX:+UseParNewGC //新生代使用並行回收器
XX:SurvivorRatio= //設置eden和survivor比例為:
XX:TargetSurvivorRatio= //設置survivor使用率
XX:MaxTenuringThreshold= //年輕對象進入老年代的年齡默認是這裡是
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26030.html