在垃圾回收器中有哪幾種判斷是否須要被回收的幾種方法

垃圾回收器在回收垃圾以前第一件事就是判斷哪些是能夠被回收的對象,如何判斷呢?咱們能夠根據該對象是否還有引用指向它來進行判斷,若是有則不能回收,若是沒有則能夠回收,具體有如下幾種算法:java

  1. 引用計數算法:
    給對象添加一個引用計數器,每當它被引用一次計數器就加一,當該引用失效時就減一,若是計數器的值爲0就表示它要被垃圾收集器做爲垃圾收集了。這種算法存在一個問題,就是若是對象之間互相循環引用,他們就不可能被垃圾回收。
    舉個栗子:
    public class RefrenceCounting {
    public Object instance = null;
    }
    public class TestGc {
    public static void main(String[] args) {
    RefrenceCounting rf1 = new RefrenceCounting();
    RefrenceCounting rf2 = new RefrenceCounting();
    rf1.instance = rf2;
    rf2.instance = rf1;
    rf1 = null;
    rf2 = null;
    System.gc();
    }
    }

從圖中能夠看到,rf1和rf2互相引用,即便rf1和rf2置空,從外界沒法訪問他們,可是他們的引用計數器不爲空,垃圾收集器沒法回收他們。算法

  1. 可達性分析算法:
    經過一系列稱爲「GC Roots」的對象做爲起點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈,當一個對象到Gc roots沒有任何引用鏈相連時則此對象是不可用的。

上圖中obj1,obj2,obj3都有引用指向Gc Roots,obj4和obj5沒有指向Gc Roots的引用,因此他們會做爲垃圾回收器的對象。可達性分析算法是java中使用的算法。
能夠做爲Gc Roots的對象包括如下幾種:
1) 虛擬機棧(棧幀中的本地變量表)中引用的對象
2) 方法區中類靜態屬性引用的對象
3) 方法區中常量引用的對象
4) 本地方法棧中引用的對象ide

引用計數算法和可達性分析算法都和引用有關,在jdk1.2之後引用被分爲四種:對象

  1. 強引用:強引用就是例如 ObjectA a = new ObjectA(),這樣的引用,存在這種引用的對象不會被垃圾回收器回收。2:軟引用:軟引用是指一些引用還有用但並不是必須,被軟引用的對象會在內存被佔滿,即將發生內存溢出異常以前進行回收。3:弱引用:被弱引用的對象只能生存到下一次垃圾回收發生以前,當下一次垃圾回收時,不管內存是否被佔滿都會回收弱引用的對象。4:虛引用,被虛引用的對象和沒有被引用的對象同樣都會被垃圾回收器回收,不一樣的是,它在被回收時會收到一個系統通知。
相關文章
相關標籤/搜索