JVM之對象存活的算法

引用計算算法:

        基本思想:給對象中添加一個引用計數器,每當有一個地方引用它時計數器的值就加1,當引用失效的時候,計數器的值就減1,,任何時候計數器的值爲0的對象就是不能再被使用的對象。

       缺陷:主流的Java虛擬機裏沒有選用引用計算法來管理內存,其中最主要的原是它很難解決對象之間相循環引用的問題。

可達性分析:

         基本思想:通過一系列的稱爲”GC Root”的對象作爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈,當一個對象到GC Rooot 沒有任何引用鏈(用圖論的話來說,就是從GC Root到這個對象不可達)時,則證明這個對象不可達。

        主流的商用程序語言(Java、C#)的實現中都是稱通過可達性分析來判斷對象是否存活的。

        在Java語言中,可做爲GC Root的對象包括下面幾種:

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

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

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

           4、  本地方法棧中JNI(即一般說的Native方法)引用的對象。

Java中的引用:

          JDK1.2以前,Java中引用的定義很傳統:如果Reference類型的數據中存儲的值代表的是另一塊內存的起始地址,就稱這塊內存代表着一個引用。

         JDK1.2以後,將引用分爲:強引用(StrongReference)、軟引用(soft Reference)、弱引用(Weak Reference)、虛引用(PhantomReference);     

         強引用:如”Object obj = new Object();”只要強引用還在,垃圾收集器永遠不會回收掉被引用的對象。

        軟引用:用來描述一些還有用,但並非必須的對象,在系統將要發生內存溢出異常之前,將會把這些對象列進回收範圍之中進行第二次回收,如果這次回收還是沒有足夠的內存,纔會拋出內存溢出異常。

        弱引用:也是用來描述非必須對象的,但是強度比軟引用更弱些,被弱引用關聯的對象這能生存到下一次垃圾回收之前。無論當前內存是否是足夠都會回收掉只被弱引用關聯的對象。

        虛引用:是最弱的一種引用,虛引用的存在,完全不會對一個對象的生存時間構成影響,也無法通過該引用來獲取一個對象的實例,爲對象設置該引用的目的是爲了在這個對象被回收之前能夠收到一個系統的通知。

        分析JVM使用對象存活的算法:

       

/****
 * JVM並不是使用引用計數法來回收對象的
 * 
 * @author xiaomage
 */
public class ReferenceCountingGC {

	public Object install = null;
	private static final int _1MB = 1024 * 1024;
	/***
	 * 這個成員屬性的唯一意義就是佔點內存,以便能在GC日誌中看清楚是否被回收過
	 */
	private byte[] bigsize = new byte[2 * _1MB];

	public static void main(String[] args) {
		testGC();
	}

	public static void testGC() {
		ReferenceCountingGC objA = new ReferenceCountingGC();
		ReferenceCountingGC objB = new ReferenceCountingGC();
		objA.install = objB;
		objB.install = objA;

		objA = null;
		objB = null;
		// 假設在這行發生GC objA和objB是否回收
		System.gc();
	}

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章