gpt4 book ai didi

java - setSize/Bounds 和 AWT/Swing 清理上的 Swing 内存泄漏

转载 作者:行者123 更新时间:2023-12-04 04:47:26 25 4
gpt4 key购买 nike

上下文:我有一个从父“启动器”程序运行的 Swing JFrame 应用程序。启动器负责检查更新和实际更新应用程序。所以它在子类加载器中运行应用程序,最终在新 jar 可用时重新启动它。

现在,一切正常,但我遇到了这个问题:看起来 JFrame 中的某些内容泄漏了,并阻止了 JFrame 和整个类加载器被垃圾收集。通过 Frame.getFrames() 循环显示 JFrame 仍然以某种方式存在,即使它已被处理。

我已经能够将测试用例减少到以下类。请注意,调用 setBounds 是错误发生所必需的,如果删除它,JFrame 将被正确地垃圾化并从 getFrames() 中消失。我无法理解该方法中是什么触发了问题,因为它在内部做了数百万件事。

我在 JDK 1.7.0_25-b17 上运行

import java.awt.Frame;
import java.io.IOException;

import javax.swing.JFrame;

public class BugTest extends JFrame {
public BugTest() {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setBounds(0, 0, 100, 100); // <- comment this and the leak disappear! -<<
setVisible(true);
}

public static void main(String[] args) throws IOException {
new BugTest();

System.out.println("Close the window then press enter");
System.in.read();
System.gc();

Frame[] frames = Frame.getFrames();
System.out.println("There are " + frames.length + " frames (should be 0)");
for (Frame frame : frames) {
System.out.println(frame);
}
}

public void finalize() {
System.out.println("Frame was finalized");
}
}

顺便说一句,看起来线程 AWT-Windows 是不可能杀死的。一旦启动,即使没有更多窗口或任何东西,它也不会终止。是否可以正确清理?

博伊斯有人对发生的事情有洞察力吗?我应该做点别的事情来清理一切吗?

最佳答案

  • Top-Level Containers基于来自 Native OS 的资源(AWT 资源)
  • 这个生命周期Objects仅与 JVM 一起结束,以及 never will be GC'ed ,您需要在您身边进行更改
  • 关于java - setSize/Bounds 和 AWT/Swing 清理上的 Swing 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17969249/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com