2017-09-14 55 views
-1

所以我有一個對象需要某些變量被實例化。這些變量通過一個對象數組傳遞給對象。然後,數組中的每個元素都被分配給一個內部變量。實例化後刪除對象的變量

這個數組是否在內部變量被分配後得到垃圾回收並且數組不會再被引用,或者應該手動完成?

class MyObject() { 
    public static Object [] values; 
    public void setvalues(inputArray) { 
     values = inputArray; 
    } 
} 

內存很重要,因爲我需要創建幾百個這些對象加上剩下的代碼。

+1

談論幾百個物體時,記憶並不重要。當每個對象需要幾兆字節時,你擔心內存;或者當你有很多數以百萬計的物體時。除非你的規模很大(並且遇到了真正的問題)......這些問題表明你不明白Java內存問題究竟是什麼。 – GhostCat

回答

3

無論陣列可享有GC取決於這個條件:

  • 有什麼還引用數組?

如果你有這樣的事情:

public class Foo { 
    private int[] myArray = {1, 2, 3, 4}; 
    YourObject obj; 

    public void someMethod() { 
     obj = new YourObject(myArray); 
    } 
} 

然後myArray不符合垃圾收集,因爲在Foo對象的變量myArray仍然引用它。然後,您可以將myArray設置爲null以使其符合GC要求。

如果myArray是一個局部變量,但是:

public class Foo { 
    YourObject obj; 
    public void someMethod() { 
     int[] myArray = {1, 2, 3, 4}; 
     obj = new YourObject(myArray); 
    } 
} 

然後是後someMethod回報資格GC,因爲myArray屆時將有超出範圍。

此外,請注意「符合GC標準」並不意味着「將立即收集」。這意味着GC有可能在未來收集它。具體什麼時候?我們不知道。

+0

而且一般來說,我們不在乎什麼時候。如果這些值真的需要擦除,我會在使用後用'0'填充數組。(我們使用'char []'作爲密碼的方式相同) – AxelH

0

我假設你的代碼看起來像這樣

//Client class 
o.setValues(arrayOfObjects); 
//In the receiving object 
public void setValues (Object[] objects){ 
// Dostuff 
} 

有兩件事情需要發生了arrayOfObjects成爲候選人GC -

  1. arrayOfObjects需要走出去的範圍。 OR
  2. arrayOfObject需要分配另一個值或null

如果您擔心內存真的,我猜測它的陣列的需要進行垃圾收集的內容,而不是該數組本身。內容將被接收對象清楚地引用,所以它們不會被垃圾收集。 希望這有助於。