4

我正在使用 java 中的大型程序工作,现在我试图避免徘徊以提高它的内存使用率,我在构造函数中实例化了一些对象,并一直实例化到程序结束,但它们并不总是被使用。我的问题特别是关于垃圾收集对象数组。

例如,当用户按下一个菜单项时,会调用一个包含许多组件的 JDialog,这些组件是在程序运行时实例化的,但我想在必要时实例化它们并在不需要时释放它们。

例如:

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

4 回答 4

3

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

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

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

但是对于这么小的程序,也许GC永远不会发生。

至少阅读维基百科上的 GC ,也许还有GC 手册

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

于 2012-10-14T07:32:04.043 回答
2

如果Options持有对数组的唯一引用,则要么使对象无法访问,要么将对象释放到垃圾收集器。

如果其他东西仍在引用该数组,则无论如何它都不会被释放,因此第一个选项是唯一会释放内容的选项。请注意,第一个选项只会释放内容,除非您也设置为 null ,否则Options仍会引用实际内容。ArrayOptions

于 2012-10-14T07:35:05.633 回答
2

正在做

Options = null;
Labels = null;

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

于 2012-10-14T07:47:26.127 回答
1

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

这是ArrayList clear()方法的源代码

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

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

Arrays.fill(Options, null);

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

于 2012-10-14T07:30:34.243 回答