2015-01-16 13 views
6

Ich bekomme derzeit eine java.lang.OutOfMemoryError: PermGen space. Ich benutze Jetty und Linux Ubuntu. Ich habe versucht, die verschiedenen Lösungen zu lesen und zu versuchen, die in früheren ähnlichen Fragen bereitgestellt wurden, aber ich habe keinen Erfolg. Eine ähnliche Frage warjava.lang.OutOfMemoryError: PermGen Raumfehler mit Jetty

Dealing with “java.lang.OutOfMemoryError: PermGen space” error

Aber diese Lösungen scheinen zu sein mit Tomcat statt Jetty. Ich erhalte immer wieder einen Fehler, wenn ich meinen Dienst einige Male neu bereitstellen muss. Zum Beispiel, um dies zu testen, gehe ich in meinen webapps-Ordner und führe Touch * .xml aus, um den Zeitstempel zu aktualisieren und dann den Anlegesteg erneut zu starten, und ich bekomme den Fehler wegen zu wenig Speicher. In meinem Anlegesteg-Ordnern (die, die sind, doc, etc, lib, Protokolle, Module, start.jar enthält) Ich bin mit

java -jar ../start.jar 

Aber das gibt mir den Fehler. Ich habe dann versucht, was ich in den anderen Beispielen lesen wie:

java -jar ../start.jar JAVA_OPTS="-Xms256m -Xmx512m -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled" 

oder

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

oder

-XX:MaxPermSize=128m 

Dann, wenn ich zu firefox gehen und navigieren Sie zu localhost:8080 und erfrischen, in das Terminal bekomme ich immer den Fehler

java.lang.OutOfMemoryError: PermGen space 

Antwort

2

Hoffentlich werden Sie in der Lage sein, diese Probleme einfach loszuwerden, indem meine ClassLoader Leak Prevention library verwenden. Es gibt viele verschiedene Fehler, die diese Art von Speicherlecks verursachen können, sowohl in Ihrem eigenen Code als auch in Bibliotheken von Drittanbietern. Weitere Informationen über das Problem, wie man es aufspürt und bekannte Täter, finden Sie in this blog series of mine. Beachten Sie insbesondere this bug in Jetty selbst, die diese Arten von Lecks für einige Versionen verursachen können.

0

Sie können diese Parameter in der start.ini-Datei im Jetty-Ausgangsordner hinzufügen. Wenn das nicht funktioniert, können Sie versuchen, eine höhere MaxPermSize, etwa 1024m, einzustellen.

4

Es gibt nichts, was Sie Ihren MaxPermSize auf einen höheren Wert (zB 1024m.), Mit Ausnahme Anheben tun können:

-XX:MaxPermSize=1024m 

Dies ist ein häufiges Problem, und auch in Jetty Documentation - Prevent Memory Leaks Abschnitt erklärt:

Permgen problems

The JSP engine in Jetty is Jasper. This was originally developed under the Apache Tomcat project, but over time has been forked by many different projects. All jetty versions up to 6 used Apache-based Jasper exclusively, with Jetty 6 using Apache Jasper only for JSP2.0. With the advent of JSP 2.1, Jetty 6 switched to using Jasper from Sun's Glassfish project, which is now the reference implementation.

All forks of Jasper suffer from a problem whereby the permgen space can be put under pressure by using jsp tag files. This is because of the classloading architecture of the jsp implementation. Each jsp file is effectively compiled and its class loaded in its own classloader so as to allow for hot replacement. Each jsp that contains references to a tag file will compile the tag if necessary and then load it using its own classloader. If you have many jsps that refer to the same tag file, then the tag's class will be loaded over and over again into permgen space, once for each jsp. The relevant Glassfish bug report is bug # 3963 , and the equivalent Apache Tomcat bug report is bug # 43878 . The Apache Tomcat project has already closed this bug report with status WON'T FIX, however the Glassfish folks still have the bug report open and have scheduled it to be fixed. When the fix becomes available, the Jetty project will pick it up and incorporate into our release program.

0

In Jetty 9.2+

In Ihrem ${jetty.base} Verzeichnis, fügen Sie das Jvm Modul + Standardkonfiguration

[user]$ cd mybase 
[mybase]$ java -jar /path/to/jetty-distribution/start.jar --add-to-start=jvm 
INFO: jvm    initialised in ${jetty.base}/start.ini (appended) 
[mybase]$ 

Jetzt ist Ihre ${jetty.base}/start.ini gehen bearbeiten und konfigurieren Sie die Eigenschaften Kommentar- die Dinge, die Sie wollen (schmieden nicht --exec Kommentar-) Anlegesteg, wenn sich ab und startete zu verwenden.

Beispiel:

# --------------------------------------- 
# Module: jvm 
--module=jvm 
## JVM Configuration 
## If JVM args are include in an ini file then --exec is needed 
## to start a new JVM from start.jar with the extra args. 
## 
## If you wish to avoid an extra JVM running, place JVM args 
## on the normal command line and do not use --exec 
--exec 
-Xmx1024m 
-Xmn512m 
-XX:MaxPermSize=128m 
# -XX:+UseConcMarkSweepGC 
# -XX:ParallelCMSThreads=2 
# -XX:+CMSClassUnloadingEnabled 
# -XX:+UseCMSCompactAtFullCollection 
# -XX:CMSInitiatingOccupancyFraction=80 
# -verbose:gc 
# -XX:+PrintGCDateStamps 
# -XX:+PrintGCTimeStamps 
# -XX:+PrintGCDetails 
# -XX:+PrintTenuringDistribution 
# -XX:+PrintCommandLineFlags 
# -XX:+DisableExplicitGC 
# -Dorg.apache.jasper.compiler.disablejsr199=true 
0

Es ist eine ältere Frage, aber das ist mein Problem gelöst:

contextHandler.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");

Verwandte Themen