当前位置: 首页 > 知识库问答 >
问题:

setsize/bounds和awt/Swing清理中的Swing内存泄漏

谭刚毅
2023-03-14

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

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");
    }
}

Boes有人对正在发生的事情有洞察力吗?我是不是应该做点别的事情来把一切都清理干净?

共有1个答案

陶高峯
2023-03-14

>

  • 顶级容器基于来自本机OS的资源(AWT resurces)

    这个对象的生命周期只与JVM一起结束,并且永远不会被GC,您需要在您的一侧进行更改

  •  类似资料:
    • 问题内容: 我只是为了好玩而创建了一个项目,该项目创建了大约5 GB的内存,并且没有删除它。只要应用程序正在运行,“内存泄漏”就在那里。我第二次关闭应用程序后,内存在2秒内恢复正常,就好像我的程序从未运行过一样。因此必须提出问题。 Windows 7完成处理后,是否会清理掉程序造成的内存泄漏? 所有Windows版本都这样做吗? Linux和Mac OS X环境会这样做吗? 问题答案: 当程序终止

    • 问题内容: 有人可以解释一下Swing和AWT有什么区别吗? 在任何情况下,AWT都比挥杆更有用/建议使用,反之亦然? 问题答案: AWT是你操作系统中存在的本机系统GUI代码的Java接口。尽管它会尝试,但在每个系统上都无法正常工作。 Swing或多或少是纯Java GUI。它使用AWT创建操作系统窗口,然后将按钮,标签,文本,复选框等的图片绘制到该窗口中,并响应你的所有鼠标单击,键输入等,从而

    • 问题内容: 我有一个没有响应的应用程序,似乎处于死锁或类似死锁的状态。请参阅下面的两个线程。请注意,线程阻塞了。但是,刚刚致电。所以块(我相信)。 这里是方法: 有谁知道这里发生了什么或如何解决? 问题答案: 在我认识的Swing开发人员中,这似乎是有问题的,但这也许不像我想象的那样广为人知。我似乎回想起在文档中看到了关于正确使用困难的严厉警告,但我很难找到任何东西。我在当前的官方文档中找不到任何

    • 问题内容: 我已经简短地研究了GWT,并且喜欢我可以用Java开发并将应用程序编译为HTML和JavaScript的想法。GWT和AWT和Swing背后的概念是相同还是不同? 问题答案: GWT在使用Widget,面板和提供的EventListener方面与Swing非常相似。观察GWT的另一种方法是将Javascript和HTML视为汇编语言,而将GWT视为生成Javascript和HTML的一

    • 与这个问题类似,我也有一个问题,我打开的第一个JFrame比后面的JFrame花的时间长得多。我有一个应用程序,它基于控制台中的用户输入打开JFrames。因此,我将有时间在一个单独的线程中预先加载JFrame内容。我应该调用Swing或AWT的哪个函数来执行这个初始化(另一个StackOverflow回答是指某个不再在JRE/JDK中的sun包)?

    • 问题内容: 我已经实现了一些带有小型图形用户界面的应用程序。没什么复杂的,但是我遇到了一些问题,这些问题导致组件无法显示或无法正常运行。 现在我的问题是: 您如何计划这些用户界面?当您需要进行更改时该怎么办?您如何调试奇怪的行为? 这几乎适用于所有类型的GUI设计。当然,使用Microsoft Visual Studio具有很大的优势,因为您几乎获得了在设计器中看到的东西。 是否存在 优秀 的AW