Meine Java-Anwendung führt viele externe Prozesse aus. Der Speicherverbrauch der Anwendung wächst stetig. Ein minimales Beispiel Reproduzieren der Fehler:JVM-Speicherverlust in Process.exec()
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();
}
}
}
Jeder Anruf Process.exec().waitFor()
zuordnet 64 Bytes, die nie freigegeben werden. Diese zugewiesenen Speicher enthält das Muster:
...
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|
...
ich den Fehler beobachten nur auf einem ARM-Linux-Rechner mit 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)
habe ich versucht, das gleiche bei x86 Linux und das Problem tritt nicht auf.
Ich habe keinen verwandten Fehler in der JVM-Fehlerdatenbank gefunden, aber ich möchte JVM nicht beschuldigen, weil alle meine früheren Versuche, JVM zu beschuldigen, mit meiner Schande geendet haben.
Gibt es etwas Schlechtes mit dem obigen Code, das ein Leck verursachen könnte oder ist es ein unbekannter/bekannter JVM-Fehler?
ok, Sie haben wahrscheinlich den Punkt getroffen. Vielen Dank! –