【问题标题】:How to garbage collect arrays of objects?如何垃圾收集对象数组?
【发布时间】:2012-10-04 12:21:05
【问题描述】:

我正在使用 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;

提前致谢

【问题讨论】:

  • 即使在这一切之后,请记住,如果这些数组仍然被引用,它们将不会被垃圾回收。

标签: java arrays object memory garbage-collection


【解决方案1】:

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

这里是来自ArrayListclear()方法的源代码

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

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

Arrays.fill(Options, null);

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

【讨论】:

  • 那么我应该先释放每个对象,然后再释放数组本身吗?
  • 你有没有参考,第一个推荐在哪里发布列表?
【解决方案2】:

在做

Options = null;
Labels = null;

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

【讨论】:

  • 如果没有其他对对象的引用就足够了。否则还不够。
【解决方案3】:

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

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

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

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

至少阅读GC on wikipedia,也许还有GC handbook

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

【讨论】:

  • 感谢您的回答@Basile 那么,“Options = null”会起作用吗?关于该程序,它是一些学生注册的完整数据库管理器,因此它可能会像整天一样打开,并且仅在有人想要查询或从数据库中添加/编辑/删除数据时使用。您认为释放经常使用的 gui 组件数组是个好主意吗?
【解决方案4】:

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

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

【讨论】:

  • 如果没有对元素的外部引用,当 OP 执行 Options = null 时,GC(如果发生)是否足够聪明地清除 Options
  • 好的,我没有保留任何其他引用数组的对象,所以我认为options = null 会起作用,谢谢大家的帮助
  • 如果有一些对元素的外部引用,什么会阻止列表本身被收集?
  • 因为这些外部引用将指向对象所在的那部分内存,并且当它被引用时,它不会被解释为垃圾。这就是我的理解,如果我错了,请纠正我。
  • @BheshGurung 我看不出我在哪里与你矛盾,我的回答的第一句话说如果数组在其他地方未引用,将Options 设置为 null 会将所有对象释放到垃圾收集器。如果数组在其他地方被引用(因此不会被释放)并且您想强制所有元素被垃圾收集,您需要单独清空引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2011-07-16
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
相关资源
最近更新 更多