2016-11-08 23 views
-4

只是想知道,如果當你設置是否有資格進行垃圾回收的Java中的所有內容都爲null?

obj1 = null; 

的對象符合GC,是不是也不錯,一切都與一個空值在技術上也有資格?

我特別想了解一下數組,說如果你有類似

[obj1, obj2, null, obj3, null, obj 4, obj5] 

GC運行,並可以刪除空對象,因此這些元素爲空?

+3

對象不能爲空,對象*引用*可以。 GC不會刪除變量或數組索引。它只能清理無法訪問的對象。 – shmosel

+1

@shmosel ...反過來,只有對象可以被垃圾收集,而不是引用。 – biziclop

+1

'obj1'前面提到的實例*可能*在'obj1 = null'後可用於GC;但許多其他參考文獻仍然可能指向該實例,從而阻止它。 –

回答

1

不存在「null對象」,null是存在於空引用中最接近的東西。關鍵定義在Java語言規範中,4.3.1. Objects

對象是一個類實例或一個數組。

引用值(通常只是引用)是指向這些對象的指針,以及指向沒有對象的特殊空引用。

obj1 = null;將參考變量obj1更改爲空。如果它以前提到一個對象,它不再這樣做。

可能有其他引用指向該對象的引用,以便該對象保持可達狀態,並且垃圾收集器將使其保持獨立。如果obj1是該對象的最後一個引用,則不再可訪問該對象,並有資格進行最終確定。

+0

好的,謝謝。我可以問,是否它的對象也持有引用,類實例/數組可以有一個空字符串等?對不起,我有點困惑。 – mucashinto

+0

@mucashinto是的,對象字段既可以是基本類型,比如「int」,也可以是它們自身的引用,它們可以是null或者指向某個對象的指針。 –

6

垃圾收集收集對象,它不收集對象的引用。垃圾收集零的想法是沒有意義的。當一個對象不再有任何指向它的引用時,GC會在最簡單的層次上進行操作,並在那個時候釋放內存。它並不關心有多少引用指向null,它只關心一個對象有多少個傳入引用。

不,GC不會從陣列中刪除空值。這不是它所做的。除此之外,數組中的空值是完全有效的,刪除它會破壞很多程序。

+0

謝謝Gabe。 – mucashinto