2010-03-12 34 views
11

我想知道Java中的垃圾收集器如何處理以下情況。Java中的垃圾收集是如何工作的?

對象A引用對象B,對象B引用對象C. 主程序引用對象A. 因此,您可以使用對象B槽對象A和對象C槽對象B槽對象A.

如果對象A和對象B之間的鏈接設置爲空,對象B和對象C會發生什麼?

對象B和對象C現在應該由垃圾收集器收集了嗎?我的意思是對象B和對象C之間仍然存在連接。

+0

我問其他的問題在不同的崗位:http://stackoverflow.com/questions/2433261/how-does-garbage-collection-in-java-work-with-classes – JordyOnrust 2010-03-12 14:17:31

回答

9

對象B和對象C現在是垃圾收集器收集的 ?

是的。那麼,他們是收集候選人,因爲沒有辦法通過爲A.

4

由於其行爲不可預知,因此無法指望垃圾回收器在特定時間工作,您只能說對象B和C只有垃圾回收的資格

1

我認爲邏輯是不同的。如果該對象不能從線程訪問,則可以收集該對象。

6

是的,如果無法從任何GC根目錄(GC根目錄通常是所有線程和堆棧中的所有引用),B和C都有資格進行垃圾收集。

+0

...和所有靜態變量 – 2010-03-12 09:51:14

+3

@Maurice:據我所知,不是直接的。靜態變量可以通過它們所屬的'Class'來達到,它們可以通過加載它們的'ClassLoader'來達到,這可以通過它加載的其他類來達到,這些類可以通過該類型的對象到達。所以如果'ClassLoader'是GCed,你甚至可能會失去一個靜態變量的值。 – 2010-03-12 10:03:39

+0

你可能是對的 – 2010-03-12 10:33:16

1

如果沒有參考對象根到達對象B和C,那麼這將是適用於GC進行

2

在事實上,在Java中的垃圾收集是一個非常複雜的事情,比在Ruby解釋器,作爲一個例子。

無論如何,理論基礎是一樣的。

GC標識程序代碼無法訪問的對象圖(也就是說它們在活動代碼中沒有更多的參考)。在談論對象圖時,我正好說到B-> C對象圖。一旦無法訪問,它可能被GC化,但由於GC試圖儘可能優化其工作以避免減慢應用程序速度,因此無法確定它何時會發生。

2

B和C適用於垃圾回收,因爲您無法再訪問它們。由於垃圾收集器的不可預測性,我們所知的是,他們很可能在未來的某個時間點被收集。

0

B沒有參照它,所以它會被垃圾首先收集,那麼它將會理解,C沒有參照它,所以C將垃圾收集。這是爲了說明,Jvm足夠聰明,可以一舉掃除它們。

+2

沒有辦法知道B會先被屏蔽掉,也就是說,你不應該在B和C裏有依賴於該順序的終結器代碼。 GC不計算參考值,但檢查可達性。如果B和C都不能到達,他們同樣無法到達。 – 2010-03-12 13:57:16

4

像往常一樣,這個article是誰想要了解垃圾收集是什麼的必讀。它寫得很好,並有解釋性圖紙。

+0

通過打開鏈接,我需要一個用戶名和密碼。 – JordyOnrust 2010-03-12 13:41:46

+0

啊,FTP再次出現。我編輯了我的帖子,另有一個應該更好的鏈接。還有一個PDF版本。 – 2010-03-12 13:48:49

+0

@ Bright010957:Tada! https://ritdml.rit.edu/dspace/bitstream/1850/5112/1/PWilsonProceedings1992.pdf – 2010-03-12 13:51:01