【问题标题】:Large amount of data deletion大量数据删除
【发布时间】:2012-09-11 19:49:53
【问题描述】:

我有一个带有 GUI 的程序,它的段可以很大并且包含很多对象。我的程序的功能之一是“关闭”该段并创建一个新段。

这整个段仅通过一个 JPanel 和一个 ArrayList 附加到程序中。如果我将这两个处理/设置为 null,则应该无法访问任何 JPanels 子项(其中一个是扩展 GUI 组件的复杂对象,但也包含很多变量)。

如果我是正确的,垃圾收集器将收集所有 JPanel 子项。

但是,孩子们的孩子们会怎样呢?我有一些“家庭”可以达到 5-6 个“世代”。它们会仅在 GC 第 5 次(或第 6 次)通过时被删除,还是会检测到整个“家庭”无法访问并立即将其全部收集(或在第一次通过时)?

编辑:另一个小问题:swing 组件是否有一种方法可以删除所有子组件?

【问题讨论】:

  • 据我所知,GC 不会对删除对象挑剔!取消引用的对象会被垃圾收集,而 gc 不会查看它们属于哪个“世代”。这意味着如果最后三代是无用的对象,它们将得到所有垃圾回收!
  • Java GC 多年来发生了变化。对于这样一个“重点突出”的问题,应该发布特定的 JVM(和使用的选项)。但是,如果帖子中的“世代”是指控制父母和祖父母等,那么它与GC 世代无关。现代 GC 可以一次性将这些“无根”图中的对象识别为“无法访问”。查看 Mark and Sweep GC 了解一些基本概念。
  • 例如blogs.msdn.com/b/abhinaba/archive/2009/01/30/…lambda.uta.edu/cse5317/notes/node47.html(当然现代 GC 是更复杂的混合体)

标签: java swing garbage-collection


【解决方案1】:

对于经验方法,反复练习您的程序并寻找here 所示的模式,其中消耗的内存未能恢复到基线。

相比之下,这个example 在每个循环之后都会返回基线。

【讨论】:

    【解决方案2】:

    您的问题的 cmets 很好地解决了删除问题。但是,如果您仍然对在不删除组件的情况下删除组件的子级感到好奇,那么答案是否定的,如 JComponent documentation 中所见(我假设您使用的是 Java 7,如果不是,您可以轻松更改为Java 的正确版本)。如果您想快速轻松地从组件中删除子组件而不删除组件本身,我建议您只重新初始化组件。

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 2014-07-16
      • 2011-01-09
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 2020-05-28
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多