溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java垃圾回收之標(biāo)記清除算法詳解

發(fā)布時間:2020-09-27 20:08:09 來源:腳本之家 閱讀:135 作者:Sam哥哥 欄目:編程語言

java垃圾回收算法之-引用計數(shù)器,這個算法其中一個優(yōu)點便是,實時性,只要對象的引用計數(shù)器的值為0,則立刻回收。接下來介紹的標(biāo)記清除算法,當(dāng)對象的引用計數(shù)器的值為0時,不會立刻被回收的。

概念介紹

root對象

在標(biāo)記清除算法中,會把如下對象稱之為root對象

  1. 被棧中的變量(棧中存的是對象的引用)所引用的對象
  2. 被static變量引用的對象

可訪問的對象

如果棧中有一個變量a引用了一個對象,那么該對象是可訪問的,如果該對象中的某一個字段引用了另一個對象b,那么b也是可訪問的??稍L問的對象也稱之為live對象

標(biāo)記清除算法介紹

該算法有兩個階段。

1. 標(biāo)記階段:找到所有可訪問的對象,做個標(biāo)記
2. 清除階段:遍歷堆,把未被標(biāo)記的對象回收

備注:

  • 該算法一般應(yīng)用于老年代,因為老年代的對象生命周期比較長。

標(biāo)記階段算法

偽代碼類似如下:

for each root variable r
  mark (r);
sweep ();

為了能夠區(qū)分對象是live的,可以為每個對象添加一個marked字段,該字段在對象創(chuàng)建的時候,默認(rèn)值是false

假設(shè)有一個對象p,p對象還間接的引用了其他對象,那么可以使用一個遞歸算法去進(jìn)行標(biāo)記,例如:

void mark(Object p)
  if (!p.marked)
    p.marked = true;
    for each Object q referenced by p
      mark (q);

這個mark方法只有當(dāng)所有對象已經(jīng)被mark后才會退出。

清除階段算法

在這個階段,需要去遍歷堆中所有對象,并找出未被mark的對象,進(jìn)行回收。與此同時,那些被mark過的對象的marked字段的值會被重新設(shè)置為false,以便下次的垃圾回收。

偽代碼如下:

void sweep ()
  for each Object p in the heap
    if (p.marked)
      p.marked = false
    else
      heap.release (p);

下面用一張圖來表示標(biāo)記清除算法的整個過程。

Java垃圾回收之標(biāo)記清除算法詳解

標(biāo)記清除算法的優(yōu)點和缺點

1. 優(yōu)點
- 是可以解決循環(huán)引用的問題
- 必要時才回收(內(nèi)存不足時)

2. 缺點:
- 回收時,應(yīng)用需要掛起,也就是stop the world。
- 標(biāo)記和清除的效率不高,尤其是要掃描的對象比較多的時候
- 會造成內(nèi)存碎片(會導(dǎo)致明明有內(nèi)存空間,但是由于不連續(xù),申請稍微大一些的對象無法做到),如下圖:

Java垃圾回收之標(biāo)記清除算法詳解

解決循環(huán)引用

出現(xiàn)循環(huán)引用的代碼如下:

class TestA{
 public TestB b;
}
class TestB{
 public TestA a;
}
public class Main{
  public static void main(String[] args){
    A a = new A();
    B b = new B();
    a.b=b;
    b.a=a;
    a = null;
    b = null;
  }
}

對應(yīng)的圖如下:

Java垃圾回收之標(biāo)記清除算法詳解

這個時候,當(dāng)a = null; b = null;的時候,圖像變成如下:

Java垃圾回收之標(biāo)記清除算法詳解

那么使用標(biāo)記清除算法是可以回收a和b的,原因是標(biāo)記清除算法是從棧中根對象開始的,改算法走完后,a對象和b對象是沒有被標(biāo)記的,會被直接回收。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對億速云的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI