2012-11-13 37 views
1

當Tester類的主要方法達到其結尾時,有多少個對象有資格進行垃圾回收?我的印象是答案是兩個,特別是a1,b1。不過,我發現某處作爲corect的答案,只有a1對象符合條件。我認爲既然我們沒有在a2中將b1賦值爲成員變量,那麼在主結束之前b1被賦值爲null,它應該被垃圾回收器收集。什麼是真的?有多少個對象符合垃圾回收器的條件?

class B { 
} 

class A { 
    static B b1; 
    B b2; 
} 

public class Tester { 
    public static void main(String[] args) { 
     B b1 = new B(); 
     B b2 = new B(); 
     A a1 = new A(); 
     A a2 = new A(); 
     a1.b1 = b1; 
     a1.b2 = b1; 
     a2.b2 = b2; 
     a1 = null; 
     b1 = null; 
     b2 = null; 
    } 
} 

回答

2

最初分配給方法範圍變量b1的對象不符合收集條件,因爲其在Class A中的引用是static。它不會在a1的特定實例中過期。這是一個鬼鬼祟祟的java語法,a1.b1A.b1是相同的參考,但它是什麼。該引用保持活動狀態,直到A類未加載/ JVM存在,而不管A的任何實例(如a1)如何。

該代碼將該方法中的指針b1指定爲空,但它不會將A.b1指定爲空。

0

以及那麼你唯一沒有廢止的參考是a2。你的答案是,你不能追蹤到任何物體從a2

所以你必須a2,並b2a2.b2

a1和引用(在你main方法的範圍)不能,因此被垃圾收集。

actaually,情感是正確的,b1是靜態的,因此是可達的。

0
  • a2 - 因爲它是不歸零
  • b2(分配給b2原始對象) - 因爲它是由A2
  • b1(原分配給b1對象)舉行的 - 因爲它在A的舉行static變量