【发布时间】: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