Java JFrame内存泄漏

Java JFrame内存泄漏,java,swing,memory-leaks,jframe,Java,Swing,Memory Leaks,Jframe,我用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.setLocationRela

我用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会导致进程使用的内存增加

  • 为什么呢
  • 有没有一种方法可以避免这种情况,使用上面相同的代码,但添加了一些内容
  • 有没有更好的方法来简单地显示JFrame
    看到内存使用率增加并不意味着内存泄漏。程序可能会使用更多内存,因为它必须为事件分派或重新绘制创建临时对象。这些临时对象是短期的,由垃圾收集器在短时间内移除;因此,他们使用的内存可以再次用于程序

    不过,由于内存不会返回到操作系统,因此在进程监视工具中不会看到这一点;JVM保留它以备将来使用。您可以使用诸如监视程序实际内存使用的工具

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

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


    [Q&A()中还研究了一个相关问题。谢谢你的回答。我按照你的建议做了(更改代码并使用VisualVM)我注意到,即使没有移动JFrame,堆的使用率也在上升。这正常吗?下面是一个例子。这看起来有点可疑,但由于程序有大量的可用内存,GC可能不会费心进行资源密集型的完全垃圾收集。如果推“执行GC”,堆的使用率应该会下降按钮,或以较小的堆运行程序较长时间。您可以安装visualgc或内存池插件,以更好地了解正在发生的情况:您将看到最年轻的一代在每个小GC上完全清除,而对象在较老的一代中缓慢累积。较不频繁的完整GC将从较老的一代中删除对象离子。
    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();
                }
            });
        }
    }