【问题标题】:Does disposing a JFrame cause memory leakage?处理 JFrame 会导致内存泄漏吗?
【发布时间】:2011-11-14 16:11:12
【问题描述】:

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

  1. 当用户单击按钮 A 时,会打开 50 个 JFrame。
  2. 当用户单击按钮 B 时,它会处理单击按钮 A 显示的所有 JFrame。

我发现点击按钮B后内存没有减少。我使用任务管理器确定了这一点,ctrl+alt+del在 Windows 中,并检查“java”的内存使用情况。

【问题讨论】:

  • 一些代码肯定会帮助我们......
  • 我的代码没什么特别的。通过新的 JFrame 创建 JFrame。通过调用 dispose() 来处理它
  • 另外,不要忘记垃圾收集仅在需要时发生,而不是在您处理完对象后发生。最后,确保您的代码不保留对刚刚释放的 50 个帧的引用。
  • @jfpoilpret 感谢您的宝贵意见

标签: java swing memory memory-leaks jframe


【解决方案1】:

如果你的框架中有一个对 GC(garbage collector) root 的强引用,那么如果你调用 dispose 方法,它不会被垃圾收集,所以你在 dispose 所有框架后看不到任何内存变化.如果你想从你应该释放的东西中获取内存,那么你需要对帧进行垃圾收集。

【讨论】:

    【解决方案2】:

    没错,没办法,解决不了(不仅仅在Java PL中),

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

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

    3) 只创建几个Top-Level Containers(同时显示的最大值),重新使用它,但将JPanel 放在那里作为1.st JComponent 并调用myPanel#removeAll(),否则您将删除RootPane 和从您的容器中仅保留边界:-) 将是半透明的

    4) 可以通过调用 GC 部分减少 JVM 使用的内存,但仅从 Graphics2DGarbage 返回数量不会立即起作用,

    5) 更多here 有用信息here

    【讨论】:

    • 顺便说一句,Java 知道问题所在吗?
    • @Bear 你有两个选择 1) 创建三个 - 四个顶级容器,第一个。将是 JFrame 其他 JDialog(也带有 Modality)或 JWindow,2)或查找 CardLayout download.oracle.com/javase/tutorial/uiswing/layout/card.html,然后在卡片之间切换而不是创建顶级容器 :-)
    • @Bear btw,Java 知道这个问题吗?,你有没有见过很多 Windows 是从另一个应用程序产生的,正如我所说的与 Java 无关的问题,因为顶级容器来自本机操作系统,只是他们的内容来自具体的编程语言
    【解决方案3】:

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

    公共无效处置()

    释放所有使用的原生屏幕资源 由这个窗口、它的子组件和它所有的子组件。那 也就是说,这些组件的资源将被销毁,任何内存 他们消费将被返回到操作系统,他们将被标记为 无法显示。

    更多信息here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-23
      • 2021-09-25
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2011-06-16
      相关资源
      最近更新 更多