深刻理解java虛擬機---讀後筆記(垃圾回收)

運行時數據區,主要包括方法區、虛擬機棧、本地方法棧、堆、程序計數器,該部份內存都是線程隔離的。java

而後和其交互的有執行引擎、本地庫接口,此部分線程之間是能夠共享的。算法

一、 引用計數算法spa

給對象添加一個引用計數器,當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1,任什麼時候刻計數器爲0的對象就是不可能再被使用的。使用的案例有微軟的COM技術、使用ActionScript3的FlashPlayer,Python語言。java語言中沒有選用引用計數算法來管理內存,其中最重要的緣由是它很難解決對象之間的相互循環引用的問題。線程

例子:日誌

public class ReferenceCountingGC{
     public Object instance = null;
     private static final int _1MB = 1024*1024;
     /**
     * 這個成員屬性惟一意義就是佔點內存,以便能在GC日誌中看清楚是否被回收過
     */
      private byte[] bigSize = new byte[2*_1MB];
      
      public static void testGC(){
            ReferenceCountingGC objA = new ReferenceCountingGC();
            ReferenceCountingGC objB = new ReferenceCountingGC();
            objA.instance = objB;
            objB.isstance  = objA;

            objA =null;
            objB = null;

            System.gc();
     }
}

這兩個對象已經不可能再被訪問啦,可是他們之間由於相互的引用着對方,因此他們的引用計數都不爲0。code

二、根搜索算法對象

經過一系列名爲「GC Roots」的對象做爲起始點,從這些節點開始向下搜索,搜索所走過的路徑成爲引用連(Reference Chain),當一個對象到GC Roots沒有任何引用連相連時,則證實該對象是不可達的,則能夠被斷定爲是可回收的對象。blog

JAVA語言中,能夠做爲GC Roots的對象包括下面幾種:接口

1)虛擬機棧(棧幀中的本地變量表)中的引用的對象。ip

2)方法區中的類靜態屬性引用的對象。

3)方法區中常量引用的對象。

4) 本地方法棧中JNI(即通常說的Native方法)的引用的對象。

相關文章
相關標籤/搜索