本文基於Oracle hotspot jvm
1.GC:查找不再使用的對象,以及釋放這些對象所管理的內存
2.算法:分代收集
Young:主要是用來存放新生的對象。
Old:主要存放應用程序中生命週期長的內存對象。
Permanent:是指內存的永久保存區域,主要存放Class和Meta的信息,Class在被 Load的時候被放入PermGen
在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就選用複製算法,只需要付出少量存活對象的複製成本就可以完成收集。而老年代中因爲對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記-清理”或“標記-整理”算法來進行回收。
3.主流收集器:
2.Throughput minor和fullgc時空停頓、
3.Cmsminor時空停頓 fullgc時僅在部分階段存在 (初始標記,重新標記)
-XX:ParallelGCThreads 限制線程數量
CMS:
CMS(Concurrent Mark Sweep)收集器是一種以獲取最短回收停頓時間爲目標的收集器。Fullgc時不再暫停應用線程,使用若干後臺線程定期對老年代空間掃描回收(標記-清除),消除在fullgc時的長時間停頓。(minorgc還是暫停所有應用線程)
參數控制:-XX:+UseConcMarkSweepGC
- XX:+UseParNewGC
G1:
G1縮短處理大堆(>4GB)時產生的停頓,採用將堆分成若干區域,新生代仍採用暫停所有應用線程的方式,多線程將存活對象移動到Survivor或老年代,老年代由後臺線程完成,大多數的工作不需要暫停應用線程。(標記-壓縮)
參數控制: -XX:+UseG1GC(默認關閉)
4.GC選擇
1.Throughput處理應用程序線程的批量任務能最大程度的利用cpu的處理能力,通常能獲得更好的性能
2.如果批量任務並沒有使用機器上所有可用cpu資源,此時Concurrent收集器能獲得更好的性能
3.通常情況下,throughput是收集器的平均響應時間比concurrent要差,但是在90%響應時間或者99%響應時間指標上,throughput要比concurrent好一些
4.使用throughput會超負荷的進行大量fullgc時,切換concurrent能獲得更低的響應時間
依據:主要是有多少空閒的cpu用於後臺的併發線程
結論:
¨批量任務:cpu多而且有剩餘選concurrent,否則throughput
¨吞吐量:存在空閒cpu時CMS,否則throughput
¨堆大小:在使用Concurrent時,若堆較小CMS,否則G1
–Xms,-Xmx(Fullgc後釋放70%空間)
-XX:NewRatio,-XX:NewSize=N,
-XX:MaxNewSize=N
–XX:PermSize=N,-XX:MaxPermSize=N,
-XX:MetaspaceSize=N,
- XX:MaxMetaspaceSize=N
–XX:ParallelGCThreads=N
–XX:-UseAdaptiveSizePolicy
6.CMS調優
1.調整堆大小增加老年代空間
2.提高後臺線程運行頻率 設置老年代空間佔用達到
N時啓動併發週期
–xx:CMSInitiatingOccupancyFaction=N,
-xx:UseCMSInitiatingOccupancyOnly=true
3.調整後臺線程 –xx:ConcGCThreads=N
4.增量式cms(java8已不推薦)