【问题标题】:JVM memory leak in Process.exec()Process.exec() 中的 JVM 内存泄漏
【发布时间】:2016-11-17 10:32:00
【问题描述】:

我的 Java 应用程序执行大量外部进程。应用程序的内存消耗稳步增长。重现错误的最小示例:

import java.io.IOException;
public class JSpawnTest {
    public static void main(String[] args) {
    while(true) {
        try {
            Process p = Runtime.getRuntime().exec("ls");
            p.waitFor();
            p.getOutputStream().close();
            p.getInputStream().close();
            p.getErrorStream().close();
        } catch (InterruptedException | IOException e) {
            e.printStackTrace();
        }
    }
}

每次调用 Process.exec().waitFor() 分配 64 个字节,这些字节永远不会被释放。这些分配的内存包含模式:

...
00 00 00 00 45 00 00 00  2f 75 73 72 2f 6c 69 62  |....E.../usr/lib|
2f 6a 76 6d 2f 6a 61 76  61 2d 37 2d 6f 70 65 6e  |/jvm/java-7-open|
6a 64 6b 2f 6a 72 65 2f  6c 69 62 2f 61 72 6d 2f  |jdk/jre/lib/arm/|
6a 73 70 61 77 6e 68 65  6c 70 65 72 00 8b 52 39  |jspawnhelper..R9|
00 00 00 00 45 00 00 00  2f 75 73 72 2f 6c 69 62  |....E.../usr/lib|
2f 6a 76 6d 2f 6a 61 76  61 2d 37 2d 6f 70 65 6e  |/jvm/java-7-open|
...

我只在带有 JVM 的 ARM linux 机器上观察到错误:

java version "1.7.0_75"
OpenJDK Runtime Environment (IcedTea 2.5.4) (75b13-2.5.4)
OpenJDK Zero VM (build 24.80-b07, mixed mode)

我在x86 linux上也试过了,没有出现问题。

我没有在 JVM 错误数据库中找到相关的错误,但我不想责怪 JVM,因为我之前所有试图责怪 JVM 的尝试都以我的耻辱告终。

上面的代码有什么不好的地方可能导致泄漏还是未知/已知的 JVM 错误?

【问题讨论】:

    标签: java memory-leaks jvm


    【解决方案1】:

    在 openjdk 错误跟踪器上简单搜索“waitFor leak”即可发现这可能是 JDK-8054841,它已被修复。

    更新到当前版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 2016-11-04
      • 2014-12-08
      • 2017-06-10
      • 2011-12-01
      相关资源
      最近更新 更多