2012-10-10 5 views
11

Ich betreiben meinen app auf Produktion env (RHEL 5.2 x64, Orakel jre 1.7_05, tomcat 7.0.28) mit JVM-Argumenten:Java OutOfMemory Ausnahme: mmap Fehler beim Laden Zip-Datei

-Xms8192m -Xmx8192m -XX:MaxPermSize=1024m 
-Doracle.net.tns_admin=/var/ora_net -XX:ReservedCodeCacheSize=512m -XX:+AggressiveOpts -XX:+UseFastAccessorMethods 
-XX:+UseStringCache -XX:+OptimizeStringConcat -XX:+UseCompressedOops -XX:+UseG1GC -Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9026 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false 

Nach mehrere Zeit i habe bekam Stack-Trace wie folgt aus:

Java HotSpot(TM) 64-Bit Server VM warning: Attempt to deallocate stack guard pages failed. 
Java HotSpot(TM) 64-Bit Server VM warning: Attempt to allocate stack guard pages failed. 
mmap failed for CEN and END part of zip file 
[...] 
Caused by: java.lang.OutOfMemoryError: null 
    at java.util.zip.ZipFile.$$YJP$$open(Native Method) ~[na:1.7.0_05] 
    at java.util.zip.ZipFile.open(Unknown Source) ~[na:1.7.0_05] 
    at java.util.zip.ZipFile.<init>(Unknown Source) ~[na:1.7.0_05] 
    at java.util.zip.ZipFile.<init>(Unknown Source) ~[na:1.7.0_05] 
    at java.util.jar.JarFile.<init>(Unknown Source) ~[na:1.7.0_05] 
    at java.util.jar.JarFile.<init>(Unknown Source) ~[na:1.7.0_05] 
    at sun.net.www.protocol.jar.URLJarFile.<init>(Unknown Source) ~[na:1.7.0_05] 
    at sun.net.www.protocol.jar.URLJarFile.getJarFile(Unknown Source) ~[na:1.7.0_05] 
    at sun.net.www.protocol.jar.JarFileFactory.get(Unknown Source) ~[na:1.7.0_05] 
    at sun.net.www.protocol.jar.JarURLConnection.connect(Unknown Source) ~[na:1.7.0_05] 
    at sun.net.www.protocol.jar.JarURLConnection.getInputStream(Unknown Source) ~[na:1.7.0_05] 
    at java.net.URL.openStream(Unknown Source) ~[na:1.7.0_05] 
    at org.apache.catalina.loader.WebappClassLoader.findLoadedResource(WebappClassLoader.java:3279) ~[na:na] 
    at org.apache.catalina.loader.WebappClassLoader.getResourceAsStream(WebappClassLoader.java:1478) ~[na:na] 
    at org.apache.http.util.VersionInfo.loadVersionInfo(VersionInfo.java:242) ~[httpcore-4.2.jar:4.2] 
    at org.apache.http.impl.client.DefaultHttpClient.setDefaultHttpParams(DefaultHttpClient.java:180) ~[httpclient-4.2.jar:4.2] 
    at org.apache.http.impl.client.DefaultHttpClient.createHttpParams(DefaultHttpClient.java:158) ~[httpclient-4.2.jar:4.2] 
    at org.apache.http.impl.client.AbstractHttpClient.getParams(AbstractHttpClient.java:448) ~[httpclient-4.2.jar:4.2] 

meinem Profiler - Everthing ok ist (Heap und Speicher nicht-Heap für 10% verwendet wird), und ich habe keine Ahnung, wo das Problem ist. jeden Tag zur gleichen Zeit, und es ist verbunden Dieses Problem ist nicht passiert zu Anwendungsverfügbarkeit

. Was ist das Problem?

Edited:

Neue Ausgabe in Protokolldatei:

Java HotSpot(TM) 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. 
Java HotSpot(TM) 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize= 
Code Cache [0x00002aaaab790000, 0x00002aaaad240000, 0x00002aaacb790000) 
total_blobs=4223 nmethods=3457 adapters=707 free_code_cache=497085Kb largest_free_block=508887936 

Aber ich habe genug Speicher: http://i.stack.imgur.com/K8VMx.jpg

Antwort: Problem in Java-Version. Es descripted hier: https://forums.oracle.com/forums/thread.jspa?messageID=10369413

Antwort

4

Ich habe diese Fehler vor beim Ausführen von Ressourcen wie Laufen aus Swap-Speicher oder laufen aus erlaubt Speicherzuordnung gesehen. Werfen Sie einen Blick auf sudo cat /proc/$PID/maps | wc -l im Vergleich zu cat /proc/sys/vm/max_map_count

Siehe Kommentare unten.


ich auch vorgeschlagen ....

Sie erscheinen in einen Fehler mit YourKit laufen zu haben. Welche Version verwendest du?

Ich würde die meisten Ihrer Optionen reduzieren, da sie entweder die Standardeinstellung sind und nichts tun oder die Angelegenheit komplizieren könnten.

-mx8g -XX:MaxPermSize=1g -Doracle.net.tns_admin=/var/ora_net 
-XX:ReservedCodeCacheSize=512m -XX:+UseG1GC -Dcom.sun.management.jmxremote.port=9026 

Ich würde versuchen, -XX:+UseG1GC als auch fallen, da dies eine relativ neue Sammler und sollten nicht Ihre Ergebnisse ändern.

+0

Aus Neugier, wie finden Sie den Teil Yourkit? – Erik

+0

Ja, ich benutze 'yjp-11.0.8', aber das Problem passiert, bevor ich es installiert habe. Ich werde versuchen, 'G1' Sammler zu fallen, aber ich denke, dass es mein Problem nicht löst, weil ich mit' G1' für die lange Zeit arbeite. Außerdem habe ich gerade ein Problem: [yjp_out] (http://my.jetscreenshot.com/demo/20121010-pnud-83kb). –

+0

Ich habe diesen Fehler schon einmal gesehen, als mir die Ressourcen ausgingen, wie z. B. dass der Swap-Space aufgebraucht ist oder die zulässige Speicherzuordnung nicht mehr ausreicht. Sieh dir 'sudo cat/proc/$ PID/maps | an wc -l 'im Vergleich zu' cat/proc/sys/vm/max_map_count' –

0

nicht sicher, was in Java 1.7 geändert hat, wie ich erinnere mich von Java 1.6 wir Xms Optionen wie unten verwenden.

-Xms=512m -Xmx=512m 
+0

Die '-Xms8192m -Xmx8192m' ist die korrekte Syntax in Java 1.6. – Erik

0

Probieren Sie diese Optionen

-Xrunhprof:heap=all,depth=12,cutoff=0 

Dies wird eine Dump-Datei in dem Anwendungsstamm erzeugen. Später können Sie mit HP Jmeter analysieren. Dies wird eine Momentaufnahme von dem, was zu Ihrem 8gigs Speicher passiert ist. Sie können HP JMeter Handbücher here sehen.

Wählen Sie auch Ihre Xrunhprof-Optionen mit Bedacht. Die obige Option, die ich erwähnte, würde eine riesige Speicherabbilddatei erzeugen. Aus Handbüchern können Sie geeignete Optionen finden.

0

einige Absätze des original blog article, erklärt dies, wie Java-jar/zip funktioniert:

Der OOM Fehler während eines nativen Aufruf (ZipFile.open (Muttersprache Method)) aus dem Java JDK ZipFile ausgelöst wird geladen unsere Anwendungs-EAR-Datei. Diese native JVM-Operation erfordert einen geeigneten nativen Speicher und virtuellen Adressraum, der verfügbar ist, um den Ladevorgang auszuführen. Die Schlussfolgerung an diesem Punkt war, dass unsere Java VM 1.5 zum Zeitpunkt der Bereitstellung keinen nativen Speicher/virtuellen Adressraum mehr hatte.

Sun Java VM nativen Speicher und MMAP Dateien

Wenn JDK 1.4/1.5, jede JAR/ZIP-Datei von der Java VM geladen werden vollständig in einen Adressenraum abgebildet. Das bedeutet, je mehr EAR/JAR-Dateien Sie in eine einzelne JVM laden, desto höher ist der native Speicherbedarf Ihres Java-Prozesses.

Dies bedeutet auch, dass die höhere ist Ihre Java Heap und PermGen Raum; Der untere Speicher bleibt für Ihre nativen Speicherbereiche wie C-Heap und MMAP-Dateien, die definitiv ein Problem darstellen können, wenn Sie zu viele separate Anwendungen (EAR-Dateien) in einem einzelnen 32-Bit-Java-Prozess bereitstellen.

Bitte beachten Sie, dass Sun Verbesserungen an JDK 1.6 (Mustang) vorgenommen und das Verhalten so geändert hat, dass das zentrale Verzeichnis der JAR-Datei noch zugeordnet ist, aber die Einträge selbst separat gelesen werden; Reduzierung der nativen Speicheranforderungen.

Ich schlage vor, dass Sie den Sun Bug Id Link unten für weitere Details zu solchen JDK 1.4/1.5-Einschränkung überprüfen. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6280693