所以我有一个对象,需要实例化某些变量。这些变量通过对象数组传递给对象。然后,数组中的每个元素都被分配给一个内部变量。
在分配内部变量并且不再引用该数组后,此数组是否会被垃圾回收,还是应该手动完成?
class MyObject () {
public static Object [] values;
public void setvalues(inputArray) {
values = inputArray;
}
}
内存很重要,因为我需要创建几百个这样的对象以及其余的代码。
数组是否符合 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将来有可能收集它。究竟是什么时候?不知道。
我假设你的代码看起来像这样
//Client class
o.setValues(arrayOfObjects);
//In the receiving object
public void setValues (Object[] objects){
// Dostuff
}
arrayOfObjects
需要做两件事才能成为GC的候选人 -
arrayOfObjects
需要超出范围。或- 需要为数组对象分配另一个值或
null
。
如果你真的关心内存,我推测需要垃圾回收的是数组的内容,而不是数组本身。接收对象将清楚地引用内容,因此它们不会被垃圾回收。 希望这有帮助。