2011-09-11 27 views
8

我写一个测试程序如下:配置JFrame会导致内存泄漏吗?

  1. 当用户点击一个按钮,它会打开50个JFrames。
  2. 当用户点击按钮B其配置通过点击按钮A.

显示的所有JFrames我发现,内存不点击按钮后B.减少我确定这个使用任务管理器,CTRL +alt + del在Windows中,并检查“java”的内存使用情况。

+0

一些代码将有助于我们肯定... –

+1

参见[删除上运行顶层容器(http://stackoverflow.com/questions/6309407/remove-top-level-container-on-runtime/6310284# 6310284)。 – trashgod

+1

我的代码没什么特别的。 通过新的JFrame创建JFrame。 通过调用dispose()来处理它 – Bear

回答

11

这是正确的,没办法,不能够解决(不仅是在Java中PL),

1)真不上运行时创造了大量的Top-Level Containers /飞起来,因为他们从来没有定稿,直到目前的JVM实例退出,而这些对象从未GC'ed只有他们Grapfics2D

2)上运行myContainer#dispose()是同为当前的JVM实例为myContainer#setVisible(false)在JVM提供和使用的内存

3)创建只有少数Top-Level Containers(最高同时显示),再利用连接这一点,但放在那里JPanel为1.st JComponent和呼叫myPanel#removeAll(),否则你会删除RootPane和从集装箱撑只有边框:-)是半透明

4)partialy可以减少JVM通过调用GC使用的内存,但是从Graphics2D只是returs量和Garbage不工作immediatelly,

5)更多here有用信息here

+0

thx很多。但我不明白建议3. – Bear

+0

顺便说一句,Java是否知道问题? – Bear

+0

@熊你有两个选择1)创建3-4个顶级容器,第1个。会是JFrame的其他JDialog(也包括Modality)或JWindow,2)或者查找CardLayout http://download.oracle.com/javase/tutorial/uiswing/layout/card.html,然后在卡之间切换而不是创建Top- Level Containers :-) – mKorbel

2

没有任何代码,我们不能帮你太多...你打电话给jFrame。 dispose()

公共无效的Dispose()

释放由此Window,其子使用 本机屏幕资源,其拥有的所有儿童。那 是,这些组件的资源将被销毁,它们消耗的任何内存 将被返回到操作系统,并且它们将被标记为 不可显示。

的更多信息可here

0

如果您的框架中存在强烈的GC(垃圾回收器)根引用,那么如果调用了dispose方法,则它不会被垃圾回收,因此在处理完所有内容后无法看到任何内存更改框架。如果你想要内存,你应该释放的东西,那么你需要垃圾收集帧。