我有这个简单的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();
}
});
}
}
答案 0 :(得分:7)
配置文件看起来很正常 - 程序创建对象,垃圾收集器不时通过删除不再可访问的对象来释放内存。
重要的观察结果是,低谷点或多或少都处于同一水平,所以看起来你的代码没有内存管理问题。
您可以通过将最大堆空间量设置为较低级别来降低峰值的高度,但无论如何5 MB都不会...
答案 1 :(得分:4)
我认为这个记忆是由于swing所使用的对象的产生,比如各种UI事件(鼠标移动等等)。 Swing倾向于为每个事件生成对象,并调用处理这些事件的侦听器。之后,这些与事件相关的对象不再使用(除非您继续引用它们)。
这不是内存泄漏,这是正常行为。实际上,在你的内存消耗截图中,当垃圾收集器释放这些对象时,内存会急剧下降。
答案 2 :(得分:0)
Java倾向于根据需要使用内存。它不会经常进行垃圾收集,因此即使在运行时使用简单的程序,它也会自然增加。因为它必须为你甚至不会看到的小事件制作课程。
如果你想强制java进行垃圾收集并手动减少内存使用量,你总是可以调用System.gc()
,但你应该只使用非常谨慎。