-1

所以我有一个需要实例化某些变量的对象。这些变量通过对象数组传递给对象。然后,数组中的每个元素都被分配给一个内部变量。

在分配内部变量并且永远不会再次引用该数组之后,该数组是否会被垃圾收集,还是应该手动完成?

class MyObject () {
    public static Object [] values;
    public void setvalues(inputArray) {
        values = inputArray;
    }
}

内存很重要,因为我需要创建几百个这样的对象以及其余的代码。

4

2 回答 2

3

数组是否符合 GC 条件取决于此条件:

  • 有什么东西还在引用数组吗?

如果,你有这样的事情:

public class Foo {
    private int[] myArray = {1, 2, 3, 4};
    YourObject obj;

    public void someMethod() {
        obj = new YourObject(myArray);
    }
}

ThenmyArray不符合垃圾回收条件,因为对象中的变量myArray仍在Foo引用它。然后,您可以设置myArraynull使其符合 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将来有可能收集它。具体什么时候?我们不知道。

于 2017-09-14T06:07:01.220 回答
0

我假设你的代码看起来像这样

//Client class
o.setValues(arrayOfObjects);
//In the receiving object
public void setValues (Object[] objects){
 // Dostuff
}

arrayOfObjects要成为 GC 的候选人,需要做两件事-

  1. arrayOfObjects需要超出范围。或者
  2. arrayOfObject 需要分配另一个值或null.

如果你真的关心内存,我猜是数组的内容需要被垃圾收集,而不是数组本身。内容将被接收对象清楚地引用,因此它们不会被垃圾收集。希望这可以帮助。

于 2017-09-14T05:58:49.913 回答