0
我的Java應用程序會執行大量外部進程。應用程序的內存消耗量穩步增長。一個最小的例如再現錯誤:Process.exec中的JVM內存泄漏()
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|
...
我只在ARM Linux機器與JVM觀察錯誤:
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 bug數據庫中發現一個相關的錯誤,但我不想責怪JVM,因爲我以前所有責備JVM的嘗試都以我的恥辱而告終。
上面的代碼可能會導致泄漏或者是未知的/已知的JVM錯誤嗎?
好吧,你可能會碰到這一點。謝謝! –