1. 程式人生 > >java幾種垃圾收集方法和垃圾收集器

java幾種垃圾收集方法和垃圾收集器

  標記清除法:

  分為兩個階段,標記----清除

  

C標記階段將所有需要回收的物件做標記,然後在清除階段將所有的標記物件回收

  但是這種回收方法有很大的缺點,那就是這兩個過程的的效率並不高,兩個過程都是效率很低的過程

  另外一個缺點就是標記清除之後,因為之前並沒有移動物件,每個標記的物件在空間的各個位置,清除

  之後會有很多不連續的記憶體,在遇到需要分配一個比較大的物件的時候,會出現雖然總量上有空間容納,

  但實際上因為這些記憶體不連續無法分配一個連續的較大的記憶體給這個較大物件的情況,而導致系統再次

  觸發一次GC

  複製演算法:

  複製演算法是將空間分為兩個大小相等的部分,每次只使用其中的一塊,然後這一塊用完之後就將自己裡面的

  還存活著的物件複製到另一塊裡面去,這樣的好處就是清除之後產生的記憶體不會出現不連續的情況,但缺點

  也很明顯,那就是需要將記憶體縮小一半,這樣看來這種代價太大,所以之後的複製演算法在這上面做出改進,將

  記憶體分為了三個區域,一個Eden區域和兩個survivor區域(大小為8/1/1,值得提醒的是這裡所說的都是新生代),

  將在回收時將Eden區域和其中一個survivor中的存活的物件複製到另一個survivor中,然後將這這兩個清理,

  相比於1/1的那種複製,顯然這種只浪費1/10的的空間,那麼這裡要問了,其實我當時也提出了這樣的問題,假如

  存活物件是大於survivor的,那該怎麼辦,書上給瞭解釋就是需要依賴其他記憶體來作為擔保.細節先不談,還有就是

  這種複製演算法,在存活物件比較多的情況下,比如老年代,效率自然就變低.所以產生了接下來這種演算法

  標記整理演算法:

  這演算法之前的步驟跟第一個標記清除一樣,將物件一一標記,但之後不同的是不對物件進行處理,而是將存活物件向一端移動

  然後清理另一邊的記憶體,這種演算法更適用於老年代

  分代收集:

  其實就是因地制宜思想,在新生代這種會有大量物件死去的時候,採用複製演算法,因為需要複製的記憶體少,而在老年代

  就採用標記清理或者標記整理

  垃圾收集器

  收集演算法不止一種,自然收集器也肯定不止一種,不同的收集器作用的範圍不同,所採用的演算法也不同

  如果將作用範圍劃分為新生代和老年代的話:

  

 

  連線代表兩者能搭配使用,所處區域代表作用範圍

  依照書上畫了一張簡易的草圖來了解這些收集器的作用範圍,然後一一細說

  Serial收集器

  作用域:新生代

  採用的收集演算法:新生代Serial採用複製演算法,老年代SerialOld採用標記整理

  特點:單執行緒收集器,在進行收集的時候,需要暫停其他所有工作執行緒(Stop the world),簡單高效,對於桌面應用場景(新生代使用記憶體不大)是很好的選擇

  缺點:在使用者不可見的情況下將使用者的工作執行緒都停掉,對其他應用造成影響

  ParNew收集器

  作用域:新生代

  演算法:新生代複製演算法,老年代複製整理演算法

  特點:是Serial的多執行緒版本,其餘跟Serial一樣,是設定-XX:+UserConcMarksSweepGC引數預設的收集器

  通過設定jvm引數為-XX:+UserParNewGC來強制使用

  只有以上兩種能與後面出現的併發收集器(CMS)同時工作

  Parallel Scavenge收集器

  作用域:新生代

  採用的收集演算法:複製演算法

  特點:多執行緒收集,關注點跟其他不同,他的目標是得到一個可以控制的吞吐量,即高效利用CPU時間,而其他則是儘可能縮短使用者執行緒的停頓時間,即有良好的相應速度提升使用者體驗

  ps:吞吐量是指執行使用者程式碼時間/(執行使用者程式碼時間和垃圾收集時間)

  Serial Old收集器

  作用域:老年代

  演算法:標記整理演算法

  特點:兩大用途,一是jdk1.5之前和與ParallelScavenge一起用,另外就是作為CMS的後備方案

  Parallel Old收集器

  作用域:老年代

  特點:注重吞吐量和CPU資源

  CMS收集器(ConcurrentMarkSweep)

  作用域:老年代

  演算法:標記清除演算法

  特點:以獲取最短回收停頓時間為目標

  四個過程:初始標記(標記GCroot能直接關聯到的物件,GC管理的主要區域是堆,所以方法區,棧,本地方法區這些不被GC管理的區域的物件一般用於做GCRoots),

  併發標記(GC root Tracing),重新標記(修正因為使用者操作而標記有變動的物件的標記記錄),併發清除,收集過程可以和使用者執行緒併發執行

  缺點:-對CPU資源敏感,所以在跟使用者程序併發執行的過程中會佔用CPU資源導致應用程式變慢,吞吐量降低

  -無法處理浮動的垃圾,即在執行過程中產生的垃圾(收集過程中使用者程序沒有停止,所以垃圾還在產生)

  -標記清除,會造成空間碎片化,在大的物件產生時候記憶體分配會遇到麻煩

  G1收集器

  作用域:

  演算法:整體標記整理區域性複製演算法

  特點:四大特點:

  1,並行與併發,G1能利用多CPU多核心的硬體優勢,來縮短STW的時間

  2,分代收集

  3,空間整合,上面所說的CMS的缺點就是空間碎片化,而G1採用整體標記整理區域性複製演算法的方法來使得空間的碎片化情況得到解決

  4,可預測的停頓,建立了可以預測的停頓時間的模型,能讓使用者明確指定一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒