处理JFrame会导致内存泄漏吗?

时间:2011-09-11 07:53:38

标签: java swing memory memory-leaks jframe

我正在编写如下测试程序:

  1. 当用户点击按钮A时,它会打开50个JFrame。
  2. 当用户点击按钮B时,它会通过单击按钮A来处理所有显示的JFrame。
  3. 我发现单击按钮B后内存没有减少。我使用任务管理器确定了这一点, ctrl + alt + del 在Windows中,并检查“java”的内存使用情况。

3 个答案:

答案 0 :(得分:11)

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

1)真的不会在Runtime / Fly上创建大量的Top-Level Containers,因为它们永远不会被最终确定,并且直到当前的JVM实例退出,并且这些Object从未被GC只用于Grapfics2D

2)运行时的myContainer#dispose()对于当前JVM实例与myContainer#setVisible(false)在与JVM可用和使用的连接中的内存相同内存

3)只创建少量Top-Level Containers(同时显示的最大值),重新使用该值,但将JPanel设置为1.st JComponent并调用myPanel#removeAll(),否则你将删除RootPane并从你的容器只留下边框:-)将是半透明的

4)通过调用GC可以减少JVM使用的内存,但只需从Graphics2DGarbage重新调整数量不会立即生效,

5)更多here有用信息here

答案 1 :(得分:2)

没有任何代码,我们无法帮助您...您是否正在调用jFrame。dispose()

  

public void dispose()

     

释放所有使用的本机屏幕资源   通过这个窗口,它的子组件,以及它拥有的所有子组件。那   是,这些组件的资源将被销毁,任何内存   他们消费将返回到操作系统,他们将被标记为   不可显示。

提供更多信息here

答案 2 :(得分:0)

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