实例化后删除对象的变量

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 的候选者 -

  1. arrayOfObjects 需要超出范围。或者
  2. 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 将来有可能收集它。具体什么时候?我们不知道。