2012-09-11 41 views
1

我有一个GUI程序,其中的段可以很大并且包含很多对象。我的计划的特点之一是“关闭”该部分并创建一个新部分。大量的数据删除

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

如果我是正确的,所有JPanels childeren的将被垃圾收集器收集。

然而,发生了什么给孩子的孩子吗?我有一些“家庭”达到5-6代“世代”。只有在GC第5次(或第6次)通过时,它们才会被删除,还是会检测到整个“家庭”无法访问,并立即收集(或首次通过)?

编辑:另一个小问题:是否有Swing组件的方法,将删除所有的它的孩子吗?

+1

据我所知GC不会挑剔删除对象!解除引用的对象在没有gc查看它们属于哪个“代”的情况下会收集垃圾。这意味着如果最后三代是无用的物体,他们将收集所有垃圾! –

+1

Java GC多年来一直在变化。对于这样一个“聚焦”的问题,应该发布特定的JVM(和使用的选项)。但是,如果这篇文章中的“世代”意味着*控制父母和祖父母等*,那么**它与GC代**无关。现代GC可以将这些“无根”图形中的对象识别为“无法访问”。查阅Mark和GC,了解一些基本概念。 – 2012-09-11 20:28:58

+0

例如http://blogs.msdn.com/b/abhinaba/archive/2009/01/30/back-to-basics-mark-and-sweep-garbage-collection.aspx和http://lambda.uta.edu/ cse5317/notes/node47.html(当然现代的GC是复杂得多的) – 2012-09-11 20:35:39

回答

0

你的问题的意见做处理删除问题的一个好工作。但是,如果您仍然对在不移除组件的情况下移除组件的孩子好奇,答案是否定的,如JComponent documentation(我假设您使用的是Java 7,如果不是,则可以轻松更改为正确的版本的Java)。如果您想要快速轻松地从组件中删除组件,而不删除组件,我建议只重新初始化组件。

2

对于经验方法,反复锻炼你的程序,寻找here所示的模式,其中消耗的内存无法恢复到基线。

image leak

与此相反,本example返回到每次循环后的基线。

image no leak