3

我用这个简单的代码在java中创建了一个新项目:

    public static void main(String[] args)
{
    JFrame frame;
    frame = new JFrame("Empty");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

我注意到移动 JFrame 会导致进程使用的内存增加。

  1. 这是为什么?
  2. 有没有办法使用上面相同的代码但添加一些内容来避免这种情况?
  3. 有没有更好的方法来简单地显示一个 JFrame?
4

1 回答 1

3

看到内存使用量增加并不意味着存在内存泄漏。该程序可能会使用更多内存,因为它必须为事件调度或重新绘制创建临时对象。这些临时对象是短暂的,会在短时间内被垃圾收集器移除;因此它们使用的内存再次可供程序使用。

但是,您不会使用进程监控工具看到这一点,因为内存没有返回给操作系统;JVM 保留它以供将来使用。您可以使用VisualVM等工具来监控程序的实际内存使用情况。

有没有更好的方法来简单地显示一个 JFrame?

您发布的代码实际上是不正确的;您不应该从程序的主线程创建和操作 GUI 对象。JFrame 这是显示Java 教程中的 a 的正确示例:

import javax.swing.*;        

public class HelloWorldSwing {
    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Add the ubiquitous "Hello World" label.
        JLabel label = new JLabel("Hello World");
        frame.getContentPane().add(label);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
于 2013-09-22T19:04:24.987 回答