简单Java程序越来越消耗内存

简单Java程序越来越消耗内存,java,swing,memory-efficient,memory-consumption,Java,Swing,Memory Efficient,Memory Consumption,我有一个简单的Java代码,它创建一个JFrame实例并显示它。此链接包含jconsole拍摄的内存消耗图的屏幕截图 让我担心的是,task manager中的java.exe显示内存使用率以每8-9秒4-5 kbs的速度不断增加。需要帮助吗 import javax.swing.*; class MyGUI extends JFrame { public void makeGUI() { setLayout(null); setSize(50

我有一个简单的Java代码,它创建一个JFrame实例并显示它。此链接包含jconsole拍摄的内存消耗图的屏幕截图

让我担心的是,task manager中的java.exe显示内存使用率以每8-9秒4-5 kbs的速度不断增加。需要帮助吗

import javax.swing.*;

class MyGUI extends JFrame
{
    public void makeGUI()
    {
        setLayout(null);
        setSize(500, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

public class Launcher
{
    public static void main(String []args)
    {
        SwingUtilities.invokeLater(new Runnable()
                    {
                       public void run()
                       {
                        new MyGUI().makeGUI();
                       }
                    });
    }
}

配置文件看起来非常正常-程序创建对象,垃圾收集器不时地通过清除不再可访问的对象来释放内存

重要的观察结果是,波谷点或多或少都处于同一级别,因此代码似乎没有内存管理问题


您可以通过将堆空间的最大数量设置为较低的级别来降低峰值的高度,但5 MB无论如何也不算多…

我认为这是由于swing使用的对象的生成,比如各种UI事件(鼠标移动等)。Swing倾向于为每个事件生成对象,并调用处理这些事件的侦听器。此后,这些事件相关对象不再使用(除非您一直引用它们)


这不是内存泄漏,这是正常行为。事实上,在内存消耗的屏幕截图中,当垃圾收集器释放这些对象时,内存会急剧下降。

Java倾向于按需使用内存。它不经常进行垃圾收集,因此即使运行一个简单的程序,它的大小也会自然增加。因为它必须为一些你根本看不到的小事件上课


如果您想强制java进行垃圾收集并手动减少内存使用,您可以随时调用
System.gc()
,但是您应该非常谨慎地使用它。

正如您所知,您应该很少需要扩展JFrame。为什么这让你担心?它的内存量非常小,可能与Swing或JVM的内部工作有关。这与内存泄漏不同,JConsole对数据的轮询实际上会导致堆内存的使用。所以测量时会有一些噪音。如果运行GC再次释放内存,这一切看起来都很酷。我认为这些更像是JVM本身创建的实例,垃圾收集器会不时擦除这些实例,而这并不是由于应用程序的实例造成的。谢谢大家给出答案。这真的很令人沮丧me@user1717415请接受答案
System.gc()
不强制垃圾收集-cf javadoc:“调用gc方法表明Java虚拟机花费精力回收未使用的对象,以使它们当前占用的内存可用于快速重用。”+1请参见此对比。