为什么 Intellij 堆内存在 Thread.Sleep 的 Hello World 上泄漏?
Why does Intellij Heap Memory Leak on Hello World with Thread.Sleep?
我注意到其他程序的堆内存使用量在增加,
所以我做了这个简单的程序来查看 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 2.8GHz 16 GB 上的系统是 macOS High Sierra。 IntelliJ 旗舰版 2018.2.
正如 Jacob 所建议的,这是完全正常的。
正如 Peter 所建议的那样,我使用 Java Mission Control 进行了测试,并验证了连续垃圾回收后的堆内存相当稳定(如果我可以将鼠标悬停在这些低点上以获得准确的值,那就太好了)。
我仍然担心这么小的测试程序定期分配140MB。我本来期望的东西要低得多。
这是 JMC 的截图和调查结果:
我注意到其他程序的堆内存使用量在增加, 所以我做了这个简单的程序来查看 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 2.8GHz 16 GB 上的系统是 macOS High Sierra。 IntelliJ 旗舰版 2018.2.
正如 Jacob 所建议的,这是完全正常的。
正如 Peter 所建议的那样,我使用 Java Mission Control 进行了测试,并验证了连续垃圾回收后的堆内存相当稳定(如果我可以将鼠标悬停在这些低点上以获得准确的值,那就太好了)。
我仍然担心这么小的测试程序定期分配140MB。我本来期望的东西要低得多。
这是 JMC 的截图和调查结果: