如何垃圾收集对象数组?

时间:2012-10-14 07:28:05

标签: java arrays object memory garbage-collection

我正在使用java中的大型程序,现在我试图避免游荡来改善它的内存使用情况,我在构造函数中实例化一些对象,并保持实例化直到程序结束但它们并不总是被使用。我的问题具体是关于垃圾收集对象的数组。

例如,当用户按下菜单项时,调用JDialog并在其中包含大量组件,这些组件在程序运行时被实例化,但我想在必要时实例化它们,并在没有时释放它们。 / p>

例如:

JRadioButton Options = new JRadioButton[20];
for (int i = 0; i < 20; i++) {
    Options[i] = new JRadioButton(Labels[i]);
}

如果我想释放数组,那我该怎么办?

此:

for (int i = 0; i < 20; i++) {
    Options[i] = null;
    Labels[i] = null;
}

或者简单地说:

Options = null;
Labels = null;

提前致谢

4 个答案:

答案 0 :(得分:4)

首先,Java对象只有在无法访问时才会被垃圾收集(并且它可能有除您的数组之外的其他引用)。然后GC几乎在不可预测的时间运行(因此内存可能会在以后释放)。

清除数组的元素不会释放整个数组,但可以释放每个元素(前提是它变得无法访问)。

将变量设置为null可能会释放数组(当然还有所有元素)。

但对于一个如此小的程序,也许GC永远不会发生。

至少阅读GC on wikipedia,或许GC handbook

请注意,某个对象的活动性是一个完整的程序属性(实际上是一个完整的进程属性:值的活跃性在特定执行中是相关的,而不是在源代码中)。换句话说,您可以执行Options = null;并且仍然可以通过其他参考路径访问Options[24]中的对象。

答案 1 :(得分:3)

如果Options保存对数组的唯一引用,则可以使对象无法访问,并将对象释放到垃圾回收器。

如果其他内容仍在引用数组,则无论如何它都不会被释放,因此第一个选项是唯一一个将释放内容的选项。请注意,第一个选项发布内容,Options仍会引用实际的Array,除非您还将Options设置为空。

答案 2 :(得分:3)

否则

Options = null;
Labels = null;

应足以释放这些对象。除非有对数组的另一个引用,否则不需要使元素为空。但是当有对数组的其他引用时,我认为将元素置零是不明智的。其他参考是有原因的。当他们不再需要数组及其内容时,他们应该发布他们的引用。

答案 3 :(得分:2)

两者都可以,但建议先使用第一个,然后再做第二个。

以下是ArrayList clear()方法

的源代码
// Let gc do its work
for (int i = 0; i < size; i++)
    elementData[i] = null;

另一种做同样事情的方法是

Arrays.fill(Options, null);

它没有做任何不同的迭代并将数组元素设置为null