3

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

在此处输入图像描述

让我担心的是,任务管理器中的 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();
                       }
                    });
    }
}
4

3 回答 3

7

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

重要的观察是波谷点或多或少都在同一级别,因此看起来您的代码没有内存管理问题。

您可以通过将堆空间的最大数量设置为较低的水平来降低峰值的高度,但 5 MB 并不多......

于 2012-10-03T14:56:35.283 回答
4

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

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

于 2012-10-03T14:58:44.423 回答
0

Java 倾向于根据需要使用内存。它不会经常进行垃圾收集,因此即使在运行时使用简单的程序,它也会自然地增加大小。因为它必须为您甚至大部分都看不到的小事件开设课程。

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

于 2012-10-03T15:04:18.013 回答