Memory leaks 继续使用Runtime.exec()循环时,内存使用量不断增加
我有一个应用程序,在这个应用程序中,我使用系统命令定期(每1~2分钟)收集(Linux)系统信息。当我检查我的进程列表时(使用Memory leaks 继续使用Runtime.exec()循环时,内存使用量不断增加,memory-leaks,java-8,runtime.exec,Memory Leaks,Java 8,Runtime.exec,我有一个应用程序,在这个应用程序中,我使用系统命令定期(每1~2分钟)收集(Linux)系统信息。当我检查我的进程列表时(使用htop),内存使用百分比不断增加。当程序启动时,使用的百分比是0.5%,第二天我检查时,在一个有8GB内存的服务器上,使用的百分比是1.4%。我能理解这是不正常的 为了说明这种行为,我创建了以下代码段,其中循环时间最快,只包含相关的代码片段。当我运行时,我可以看到内存使用率上升得非常快(在不到15分钟内从0.5%上升到1.0%) 是内存泄漏还是其他原因?这里有我遗漏的东
htop
),内存使用百分比不断增加。当程序启动时,使用的百分比是0.5%,第二天我检查时,在一个有8GB内存的服务器上,使用的百分比是1.4%。我能理解这是不正常的
为了说明这种行为,我创建了以下代码段,其中循环时间最快,只包含相关的代码片段。当我运行时,我可以看到内存使用率上升得非常快(在不到15分钟内从0.5%上升到1.0%)
是内存泄漏还是其他原因?这里有我遗漏的东西吗。伙计们,请告诉我。当99%的内存仍然可用时,JVM为什么要费心清理呢?您的数字意味着示例程序可以运行一天,并且仍然只使用一半的内存,那么为什么它要在15分钟后浪费CPU周期进行垃圾收集呢?而实际服务器的数字表明,抢占式清理的需求更少。你的主要目标是拥有尽可能多的未使用内存吗?谢谢你的回答。我关于CPU使用率的观点不适用于整个系统。这只是为了上面提到的节目。我不明白你的评论是什么意思。如果8GB系统上的内存使用率从0.5%提高到1.4%,则意味着应用程序将多使用74MB内存。一天后。如果你说JVM被配置为最多使用80MB,我可以理解你会感到震惊,但这是一个重要的信息,不应该从问题中忽略。如果没有这一点,我假设JVM堆没有配置限制,0.9%正好是,只有0.9%。一个可笑的小部分。上面的信息是我从测试服务器收集的。我担心的是,当我在一个装有1.5G RAM的Linux机箱中运行程序时,其他进程使用的是almose 1.2 G RAM。无论如何,我唯一想确定的是,没有任何内存泄漏,JVM会在系统需要时释放它所持有的内存。这篇文章已经足够老了。可能已经找到了解决方案。但我认为@BlueBird想要做的是设置JVM最大内存大小。如果是,则将-Xmx和-XX:MaxMetaspaceSize传递给JVM。Java内存管理由GC控制。开发人员不应该直接控制GC。
boolean done = false;
//Process p = null;
while (!done) {
Process p;
try {
p = Runtime.getRuntime().exec("ls /tmp");
p.waitFor();
System.out.println("Done");
// closing the opened filedescriptors/anything
// p.destroy() // not helpful even
// then used the below,, still the same
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}