所以我有一个需要实例化某些变量的对象。这些变量通过对象数组传递给对象。然后,将数组中的每个元素分配给内部变量。
在分配内部变量并且从不再次引用数组之后,是否会对此数组进行垃圾回收,还是应该手动完成?
class MyObject () {
public static Object [] values;
public void setvalues(inputArray) {
values = inputArray;
}
}
内存非常重要,因为我需要创建几百个这些对象以及其余的代码。
答案 0 :(得分:3)
阵列是否符合GC条件取决于以下条件:
如果,你有这样的事情:
public class Foo {
private int[] myArray = {1, 2, 3, 4};
YourObject obj;
public void someMethod() {
obj = new YourObject(myArray);
}
}
然后myArray
不符合垃圾回收的条件,因为myArray
对象中的变量Foo
仍在引用它。然后,您可以将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有可能在将来收集它。具体什么时候?我们不知道。
答案 1 :(得分:0)
我假设你的代码看起来像这样
//Client class
o.setValues(arrayOfObjects);
//In the receiving object
public void setValues (Object[] objects){
// Dostuff
}
arrayOfObjects
要成为GC的候选者需要做两件事 -
arrayOfObjects
需要超出范围。 OR null
。 如果你真的关注内存,我会猜测它需要被垃圾收集的数组内容,而不是数组本身。接收对象将明确地引用内容,因此它们不会被垃圾回收。 希望这会有所帮助。