JVM知識點——JVM垃圾收集器總結

1、三個概念

Stop-the-World:JVM執行任何一種GC算法時是會中止應用程序的執行的,因此大多數GC優化都是從減小Stop-the-world發生的時間來提升程序性能。算法

SafePoint:安全點。在JVM進行可達性分析的時候要在安全點進行,這個點是全部線程都被凍結,避免出現分析過程當中對象的引用關係還在不斷變化。前面說的程序中止不是隨便中止,而是到達安全點以後再停頓下來。產生安全點的地方有:方法調用,循環跳轉,異常跳轉等安全

2、年輕代區的垃圾收集器

一、Serial收集器數據結構

  單線程收集器,進行垃圾收集的時候必須暫停其餘全部工做線程,直到收集結束。對於運行在client模式下的虛擬機是個很好的選擇。能夠經過設置-XX:+UseSerialGC進行使用,使用的是複製算法回收。併發

二、ParNew收集器佈局

  使用多條線程進行垃圾收集,其他行爲和Serial收集器同樣,能夠和CMS收集器配合工做。能夠經過設置-XX:+UseParNewGC進行使用,通常使用在server模式下。使用的是複製算法回收。性能

三、Parallel Scavenger收集器優化

  前面兩個收集器在於關注用戶線程停頓時間,而這個收集器關注點在於達到一個可控的吞吐量【吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)】,適合在後臺運算不須要太多交互的任務。能夠經過設置-XX:+UseParallelGC進行使用,是在server模式下的默認收集器。使用的是複製算法回收。線程

3、老年代區的垃圾收集器

一、Serial Old收集器cdn

單線程收集器,進行垃圾收集的時候必須暫停其餘全部工做線程,直到收集結束。client模式下的虛擬機默認的老年代收集器。能夠經過設置-XX:+UseSerialOldGC進行使用,使用的是標記-整理算法回收。server

二、Parallel Old收集器

  配合年輕代爲Parallel Scavenger收集器使用的,行爲都與Parallel Scavenger收集器差很少只是算法不同。一樣適合在後臺運算不須要太多交互的任務。能夠經過設置-XX:+UseParallelOldGC進行使用。使用的是標記-整理算法回收。

三、CMS收集器

  是一種以獲取最短回收停頓時間爲目標的收集器,能夠經過設置-XX:+UseConcMarkSweepGC進行使用。基於標記-清除算法。運動過程有6個步驟:

  初始標記:須要虛擬機進行stop-the-world,僅標記一下GC Roots所能鏈接到的對象

  併發標記:進行GC Roots 追蹤的過程,這時候程序不會停頓

  併發預清理:查找執行併發標記階段從年輕代進入老年代的對象。

  從新標記:進行stop-the-world,掃描CMS堆中的剩餘對象

  併發清除:清理垃圾對象,程序不會停頓

  併發重置:重置CMS收集器的數據結構

  使用這個收集器使得用戶進程能在運行的時候進行清理垃圾對象。在清理過程當中產生的垃圾對象會由下一次再回收。可是因爲使用的是標記-清除算法,容易使得內存碎片化。

四、G1收集器

  這是一個既用於年輕代也用於老年代的收集器。使用G1收集器時Java堆就會與使用其餘收集器的佈局不一樣。它是將整個Java堆內存劃分爲多個大小相等的Region,這樣年輕代和老年代就再也不物理隔離。

  能夠經過設置-XX:+UseG1GC進行使用,使用的是複製+標記-整理算法回收。這樣就不會出現內存碎片化。

  具有以下特色:

  並行與併發,使用多個CPU來縮短stop-the-world的停頓時間,這樣在GC的時候不須要停頓Java線程。使得GC和用戶線程併發執行。

  分代收集:G1是存在於年輕代和老年代的收集器。年輕代使用負責算法,老年代使用收集器。

  空間整合。是基於標記-整理的算法實現的。能夠解決內存碎片的問題。

  可預測的停頓。能讓使用者明確指定在一個長度爲M毫秒的時間片斷內。

總結

  這個其實只是針對不一樣場景進行選擇收集器,只須要了解收集器適用的場景和做用。具體的算法以前已經介紹過。

相關文章
相關標籤/搜索