Memory leaks 继续使用Runtime.exec()循环时,内存使用量不断增加

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%) 是内存泄漏还是其他原因?这里有我遗漏的东

我有一个应用程序,在这个应用程序中,我使用系统命令定期(每1~2分钟)收集(Linux)系统信息。当我检查我的进程列表时(使用
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();
        }
    }