2015-01-04 55 views
1
class ClassA { 
    ClassB mem1 = new ClassB(); 
    ClassB mem2 = new ClassB(); 
} 

class ClassB { 
} 

public class Sample { 
    public static void main(String[] args) { 
     ClassA obj1 = new ClassA(); 
     ClassB obj2 = obj1.mem1; 

     obj1 = null; 

     obj2 = null; 
    } 
} 

在上面的程序中,行後發生了什麼:obj1 = null當對象被解除引用但其成員對象仍被引用時會發生什麼?

obj1準備好垃圾收集,即使其中一個成員對象仍在被引用?

+2

他們無法訪問了。 – Maroun 2015-01-04 12:23:40

+1

它有資格使用GC – amit 2015-01-04 12:24:44

+0

[適用於Java的垃圾回收變量的可能變量](http://stackoverflow.com/questions/13634766/eligible-variables-for-garbage-collection-in-java) – Joe 2015-01-04 12:26:17

回答

1

自動垃圾回收是查看堆內存,識別哪些對象正在使用哪些不是,以及刪除未使用的對象的過程。一個正在使用的對象或一個被引用的對象,意味着你的程序的某個部分仍然保持着一個指向該對象的指針。未使用的對象或未引用的對象不再被程序的任何部分引用。所以未被引用的對象所使用的內存可以被回收。

Java Garbage Collection Basics

在這種情況下,當obj1 = null;加工有向ClassA類型的對象的引用它指向,所以它是用於eligable垃圾收集。然而,ClassB對象mem1仍然以obj2的形式提供參考,因此至少保持到行obj2 = null;被執行。

0

obj1不再被引用後,它就有資格進行垃圾回收。 mem1仍然有一個參考,所以如果Java在這一點上垃圾收集,obj1mem2它也可以被釋放,但mem1將保持不變,因爲obj2仍然指向它。

當然,在obj2 = null之後,也可以收集。

0

你有3類情況:其一ClassA(我稱之爲classA_1)和兩個ClassBclassB_1classB_2)。現在看看這3個實例存在的所有參考路徑。

obj1 = null之前,它看起來不合適。像這樣:

classA_1 <- Sample.main.obj1 
classB_1 <- classA_1.mem1 <- Sample.main.obj1 
classB_1 <- Sample.main.obj2 
classB_2 <- classA_1.mem2 <- Sample.main.obj1 

obj1 = null後,它看起來像這樣,在no ref.手段,它是符合垃圾回收的,因爲它沒有引用指向它。

classA_1 <- no ref. 
classB_1 <- classA_1.mem1 <- no ref. 
classB_1 <- Sample.main.obj2 
classB_2 <- classA_1.mem2 <- no ref. 

唯一的路徑是這樣的:classB_1 <- Sample.main.obj2。有沒有有效的參考對象classB_2classA_1的路徑。所以這些對象可以被收集。

相關問題