2017-09-14 48 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

如果您担心内存真的,我猜测它的阵列的需要进行垃圾收集的内容,而不是该数组本身。内容将被接收对象清楚地引用,所以它们不会被垃圾收集。 希望这有助于。