实例化后删除对象的变量
Delete object's variable after instantiation
所以我有一个对象需要实例化某些变量。这些变量通过对象数组传递给对象。然后,数组中的每个元素都被分配给一个内部变量。
在分配内部变量并且不再引用该数组后,这个数组是否会被垃圾回收,还是应该手动完成?
class MyObject () {
public static Object [] values;
public void setvalues(inputArray) {
values = inputArray;
}
}
内存有点重要,因为我需要创建几百个这样的对象以及其余代码。
我假设你的代码是这样的
//Client class
o.setValues(arrayOfObjects);
//In the receiving object
public void setValues (Object[] objects){
// Dostuff
}
arrayOfObjects
需要发生两件事才能成为 GC 的候选者 -
arrayOfObjects
需要超出范围。或者
- arrayOfObject 需要分配另一个值或
null
。
如果您真的 关心内存,我推测需要进行垃圾回收的是数组的内容,而不是数组本身。内容显然会被接收对象引用,因此不会被垃圾回收。
希望这有帮助。
数组是否符合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
returns 之后就有资格进行 GC,因为那时 myArray
将超出范围。
此外,请注意 "eligible for GC" 并不意味着 "will be collected immediately"。这只是意味着 GC 将来有可能收集它。具体什么时候?我们不知道。
所以我有一个对象需要实例化某些变量。这些变量通过对象数组传递给对象。然后,数组中的每个元素都被分配给一个内部变量。
在分配内部变量并且不再引用该数组后,这个数组是否会被垃圾回收,还是应该手动完成?
class MyObject () {
public static Object [] values;
public void setvalues(inputArray) {
values = inputArray;
}
}
内存有点重要,因为我需要创建几百个这样的对象以及其余代码。
我假设你的代码是这样的
//Client class
o.setValues(arrayOfObjects);
//In the receiving object
public void setValues (Object[] objects){
// Dostuff
}
arrayOfObjects
需要发生两件事才能成为 GC 的候选者 -
arrayOfObjects
需要超出范围。或者- arrayOfObject 需要分配另一个值或
null
。
如果您真的 关心内存,我推测需要进行垃圾回收的是数组的内容,而不是数组本身。内容显然会被接收对象引用,因此不会被垃圾回收。 希望这有帮助。
数组是否符合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
returns 之后就有资格进行 GC,因为那时 myArray
将超出范围。
此外,请注意 "eligible for GC" 并不意味着 "will be collected immediately"。这只是意味着 GC 将来有可能收集它。具体什么时候?我们不知道。