2013-02-09 27 views
6

我已經對java垃圾回收器進行了一些研究,並瞭解不再引用的對象將由垃圾回收器處理。就對象數組而言,我知道將一個新對象分配給數組中的一個位置並不能正確釋放先前分配的對象。在Java垃圾回收數組中取消引用對象

  1. 我想知道如何從位置x的數組中刪除並正確釋放對象,並將新對象分配給位置x處的同一數組。
  2. 我也想知道如何正確釋放數組本身。

回答

9

在數組中的對象設置爲null或其他物體使它符合垃圾收集,假設有隨時隨地存儲在同一個對象的引用。

所以,如果你有

Object[] array = new Object[5]; 
Object object = new Object() // 1 reference 
array[3] = object; // 2 references 
array[1] = object; // 3 references 


object = null; // 2 references 
array[1] = null; // 1 references 
array[3] = new Object(); // 0 references -> eligible for garbage collection 

array = null; // now even the array is eligible for garbage collection 
// all the objects stored are eligible too at this point if they're not 
// referenced anywhere else 

垃圾收集很少將收回當地人的記憶雖然如此,垃圾收集將主要的功能範圍之外已經發生。

+2

很好的答案。任何對象的置零都會刪除對象的引用,並使其成爲垃圾收集的候選對象。 +1 – yams 2013-09-04 16:28:03

0

那麼當垃圾收集器不再被引用時,垃圾收集器會自動收集所有對象。你不必爲此而苦惱。如果你希望你可以給數組賦值null,並且在GC的下一次運行中,分配給數組的內存將被釋放。對於明確運行GC,你可以做

java.lang.Runtime.getRuntime().gc(); 
+3

你不應該明確地調用垃圾回收器,除非你有一個非常好的理由。而這些非常罕見。 – 2013-02-09 19:12:21

+3

什麼是「可證明非常好的理由」的例子? – 2013-06-13 14:52:59

1

在java中,不需要顯式釋放對象,無論它們是從數組引用還是簡單字段或變量。一旦對象不能從根集強力訪問,垃圾收集遲早會釋放它。嘗試幫助GC完成工作通常是不合理的。閱讀article瞭解更多詳情。

0

對象De分配應在關閉或打開時通過將對象清零來進行。 JUnit測試在對象上執行assertGC以確保所有對象都被垃圾收集。如果Java有一個引用,Java將不會垃圾收集它。我強烈建議做JUnit測試。