Java 为什么Intellij堆内存在Hello World上通过Thread.Sleep泄漏?

Java 为什么Intellij堆内存在Hello World上通过Thread.Sleep泄漏?,java,intellij-idea,memory-leaks,jconsole,Java,Intellij Idea,Memory Leaks,Jconsole,我注意到堆内存在其他程序上的使用正在增加, 因此,我制作了这个简单的程序,以查看JConsole是否在简单的HelloWorld应用程序上报告了相同的情况。我在一个循环中添加了一个Thread.sleep(),以使应用程序在测试时保持活动状态 这个问题的根源是什么?我应该担心吗 此图表显示了我的测试设置: 以下是我用于测试的代码: public class Main { public static void main(String[] args) { System.out.printl

我注意到堆内存在其他程序上的使用正在增加, 因此,我制作了这个简单的程序,以查看JConsole是否在简单的HelloWorld应用程序上报告了相同的情况。我在一个循环中添加了一个Thread.sleep(),以使应用程序在测试时保持活动状态

这个问题的根源是什么?我应该担心吗

此图表显示了我的测试设置:

以下是我用于测试的代码:

public class Main {
public static void main(String[] args) {
    System.out.println("Hello World!");
    while(true)
    {
        try {
            System.out.print("Sleeping...");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Working");
    }
}
}
此图表显示堆内存在15分钟内翻倍:

25分钟后,我确实看到了回收的内存,但同样的泄漏仍在继续:

这就是intellij的行为方式吗?回收的内存是否足以说明这不是泄漏


注:系统为MacBook Pro上的macOS High Sierra 2.8GHz 16 GB。IntelliJ Ultimate 2018.2.

正如Jacob所说,这是完全正常的

正如Peter所建议的,我使用Java任务控制进行了测试,并验证了连续垃圾收集后的堆内存是相当稳定的(如果我能够悬停在这些低位以获得准确的值,那就太好了)

我仍然担心这样一个小的测试程序会定期分配140MB。我本以为价格会低得多

以下是JMC的截图和调查结果:


这完全正常;堆内存允许累积,直到调用垃圾收集,从而释放其中的一部分。您使用的管理控制台正在创建垃圾。如果你降低你的采样率,它会增加得更少。要查找内存泄漏,只需查看完整GC后的内存消耗情况。改用
jstat
,这样会产生更少的垃圾。@Peter关于降低采样率的有趣说明。我会查一查。此外,我还将检查jstat。谢谢。@Geodepe BTW Java任务控制在分析方面比其他方面好得多(尽管不是持续监控)