java 垃圾回收

本文基於Oracle hotspot jvm


1.GC:查找不再使用的對象,以及釋放這些對象所管理的內存

2.算法:分代收集


Young:主要是用來存放新生的對象。

Old:主要存放應用程序中生命週期長的內存對象。

Permanent:是指內存的永久保存區域,主要存放ClassMeta的信息,Class在被 Load的時候被放入PermGen 

在新生代中,每次垃圾收集時都發現有大批對象死去,只有少量存活,那就選用複製算法,只需要付出少量存活對象的複製成本就可以完成收集。而老年代中因爲對象存活率高、沒有額外空間對它進行分配擔保,就必須使用“標記-清理”或“標記-整理”算法來進行回收。


3.主流收集器:

   

   Serial
   Throughput(Parallel):Parallel新生代+ParallelOld老年代
   CMS(Concurrent mark sweep ):ParaNew新生代 +CMS老年代
   G1(GarbageFirst)
   備註:

          2.Throughput minorfullgc時空停頓、

          3.Cmsminor時空停頓 fullgc時僅在部分階段存在  (初始標記,重新標記)


 Serial :
      串行收集器是最古老,最穩定以及效率高的收集器,可能會產生較長的停頓,只使用一個線程去回收。新生代、        老年代使用串行回收;新生代複製算法、老年代標記-壓縮;垃圾收集的過程中會StopThe World(服務暫停)
          參數控制:-XX:+UseSerialGC  串行收集器
 Parallel:
     Parallel Scavenge收集器類似ParNew收集器,Parallel收集器更關注系統的吞吐量新生代複製算法多線程來進行年輕代的垃圾收集、老年代串行標記-壓縮
  參數控制:-XX:+UseParallelGC  使用Parallel收集器+老年代串行
ParallelOld
  Parallel OldParallelScavenge收集器的老年代版本,使用多線程和“標記-整理”算法。這個收集器是在JDK1.6中才開始提供,和ParallelGC一樣。不同之處,ParallelOld GC在年輕代垃圾收集和年老代垃圾回收時都使用多線程收集。
  參數控制: -XX:+UseParallelOldGC 使用Parallel收集器+老年代並行
ParNew:
  ParNew收集器其實就是Serial收集器的多線程版本。新生代並行,老年代串行;新生代複製算法、老年代標記-壓縮(應用程序暫停)
        參數控制:-XX:+UseParNewGC  ParNew收集器

                         -XX:ParallelGCThreads 限制線程數量

CMS:

         CMSConcurrent 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

  ¨吞吐量:存在空閒cpuCMS,否則throughput

  ¨堆大小:在使用Concurrent時,若堆較小CMS,否則G1

5.GC調優

  

¨調整堆大小:

      –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調優

  

¨併發失效:CMS不能夠以足夠快的速度清理老年代空間,新生代需要進行垃圾回收時,cms收集器發現老年代沒有足夠的空間容納這些晉升對象不得不對老年代進行垃圾回收(發生fullgc)
¨優化途徑:

     1.調整堆大小增加老年代空間

     2.提高後臺線程運行頻率 設置老年代空間佔用達到

         N時啓動併發週期

        –xx:CMSInitiatingOccupancyFaction=N,

        -xx:UseCMSInitiatingOccupancyOnly=true

     3.調整後臺線程 –xx:ConcGCThreads=N

     4.增量式cms(java8已不推薦)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章