☆3.java虛擬機垃圾收集器與內存分配策略(上)(中階理論篇)

1.概述

java中的垃圾回收技術被當做是java語言的伴生產物,經過半個世紀的發展,這項技術已經相當成熟,基本進入“自動化”時代,當需要排查各種內存泄漏,內存溢出問題時,當垃圾收集稱爲系統達到更高併發量的瓶頸時,我們就需要對這些“自動化”的技術實施必要的監控和調節。本篇主要解決一下三個問題:

  1. 哪些內存需要回收?
  2. 什麼時候回收?
  3. 如何回收?

通過上一篇,java虛擬機管理的內存中,程序計數器,虛擬機棧,本地方法棧3個區域隨線程而生,隨線程而滅,大體上可認爲在編譯期可知的,因此這幾個區域的內存分配和回收都具備確定性,因此不需要過多考慮回收問題,而java堆和方法區只有在程序運行過程中才知道會創建哪些對象,這部分的內存的分配和回收都是動態的,垃圾回收器所關注的就是這部分的內存,我們探討的回收也是隻這一部分。

2.對象的生死存亡

在堆裏面存放着java世界中幾乎所有的對象實例,垃圾收集器在堆進行回收前,第一件事就是要確定這些對象中哪些還活着,哪些已經死去,即不可能被任何途徑使用的對象。

2.1引用計數算法

原理:就是給對象添加一個引用計數器,每被引用一次,計數器的值就加1,引用失效,計數器的值就減去1,這樣,計數器的值爲0 的對象可被認爲“死去”。

優點:實現簡單,判斷效率高;

缺點:相互引用的兩個對象,即使是這兩個對象已經不可能在被訪問,但是對象的計數器值不爲0,例如:objA.instance = objB,objB.instance = objA.

2.2可達性分析算法

原理:通過一系列的稱爲“GC Roots”的對象作爲起始點,從這些節點開始向下搜索,搜索做過的路徑被稱爲“引用鏈”,當一個對象到GC Roots沒有任何引用鏈時,則證明對象時不可用的。

在java語言中,可以作爲GC Roots的對象包括下面幾種:

  1. 虛擬機棧(棧幀中的本地變量表)中引用的對象;
  2. 方法區中類靜態屬性引用的對象;
  3. 方法區中常量引用的對象;
  4. 本地方法棧中JNI(即一般說的Native方法)引用的對象

3.垃圾收集算法

本節只簡單介紹幾種主要算法思想。

3.1 標記-清除算法

標記-清除算法是最基礎的收集算法,後面的算法都是基於這種思想進行改進的。標記-清除算法分爲“標記”和“清除”兩個階段。首先是標記所有需要回收的對象,在標記完成後統一回收所有被標記的對象。

 

主要不足:①效率問題,標記和清除兩個過程效率都不到;②空間問題,標記清除後會產生大量的不連續的內存碎片,空間隨便太多可能會導致以後再程序運行過程中需要分配比較大的對象時,無法找到足夠的連續內存而不得不提前觸發另一次垃圾回收動作。

3.2 複製算法

爲了解決效率問題,一種稱爲“複製”的手機算法出現了,他可將內存劃分爲大小相等的兩塊,每次只使用其中一個。當着一塊內存使用完了,就將或者的對象複製到另一塊上面,然後再把已使用過的空間一次性清理掉。這樣使得每次只對半個區域的內存進行回收,內存分配時也就不需要考慮內存碎片的複雜情況,只要移動堆頂指針,按順序分配內存即可,實現簡單,運行高效。缺點是耗費內存。

 

現在的商業虛擬機都是採用這種回收算法來收集新生代,新生代對象中的對象98%都是朝生夕死的,所以比不需要按照1:1的比例來劃分內存空間,而是將內存劃分爲一塊較大的Eden空間和兩塊較小的Survivor空間,每次使用Eden和其中一塊Survivor。當回收時,Eden和Survivor中還存活的對象一次性的複製到另外一個Survivor空間上,最後清理掉Eden和剛纔使用過的Survivor空間。HotSpot虛擬機默認Eden和Survivor的大小比例是8:1。

由於我們那沒辦法保證每次回收都只有不多於10%的對象存貨,當Survivor空間不夠用時,需要依賴其他內存(這裏指老年代)進行分配擔保。

3.3 標記-整理算法

複製收集算法在存活對象率較高時就要進行較多的複製操作,效率將會降低。更關鍵的是,你如果不想浪費50%的空間,就需要額外的空間進行分配擔保,以應對被使用中的內存中所有的對象都是100%存活的情況,所以子啊老年代一般不採用複製算法。

 

根據老年代的特點,使用標記-整理算法,標記過程仍然是於標記-清理算法一樣,但是後續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一段移動,然後直接清理掉端邊界以外的內存。

3.4 分代收集算法

這是一種雜種算法,新生代採用複製算法,老年代採用標記-整理算法或者標記-清理算法。

 

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 7000
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章