2011-08-15 135 views
0

http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#99740例如A3.3說,它表示一個對象可能仍然不可用於垃圾收集,即使它可能超出範圍。 IT只有在方法取消堆棧時纔可用。現在,如果我們考慮以下情況:對象準備垃圾收集,Java

void foo(){ 
Dog a = new Dog(); 
Dog b = new Dog(); 
b=a 
while(true)//loop for long time 
} 

將對象B指可立即用於垃圾回收,或返回,把foo()方法之後。

+1

你的意思是對象'b'指的是在它被重新分配給與'a'相同的對象之前的初始,正確的? – Thilo

回答

4

的堆棧槽在使用中保持,直到該方法退出。沒有與內部}對應的JVM操作碼,所以JVM不知道它已經離開了內部範圍。但它確實知道該方法何時返回。

+0

O這個澄清,非常感謝:) – Jatin

+1

+1。即使堆棧槽仍然在使用中,它只會保存分配給它的* last *對象。如果不能等待方法結束,也可以將其設置爲null。 – Thilo

2

的狗,以前知道作爲b應儘快你重新分配變量符合垃圾收集。

稱爲ab(在重新賦值之後)的狗將保持在該範圍內,直到該方法結束。

1

原來b(第二創建Dog)可立即在循環開始前的垃圾收集,因爲沒有舉行,它的參考(包括ab參考第一Dog創建)。

+0

如果是這樣的情況,則在中:public void run()的{ 嘗試{ 對象foo =新對象(); foo.doSomething(); }趕上(例外五){// 任何 } 而(真){//做的東西} //永遠循環下去 }爲什麼會這樣運行的回報 – Jatin

+0

只有當@Jatin對象foo是可進行垃圾回收:我懷疑是這樣。所有這些孤兒都將被收集。 – Thilo

0

除了正確的答案已經給了,你的測試基本上是有缺陷的。空運行while循環將永遠不會觸發GC,因爲它只能運行(簡化位)當您運行的內存和Java需要做的老物件的一些清理工作。

+0

永遠我的意思,while循環很長一段時間內的代碼塊。 IE瀏覽器將對象是立即可用或之後該方法返回 – Jatin

+0

@Jatin:怎麼可能'了'或'B'可以在方法返回之前收集的?畢竟它們仍然在範圍內,例如可以在循環中使用。 (一個聰明的編譯器可能會發現它們是否被實際使用並縮短了它們的範圍,但是根據你的代碼,它們與該方法具有相同的範圍)。 – Thilo

+0

所以基本上意味着對象只有在方法返回時纔可用於垃圾收集?在這種情況下a和b – Jatin