2015-01-16 5 views
6

Я в настоящее время получаю java.lang.OutOfMemoryError: PermGen space. Я использую Jetty и Linux Ubuntu. Я попытался прочесть и попробовать различные решения, которые были предоставлены в предыдущих похожих вопросах, но я не добился успеха. Один подобный вопрос былjava.lang.OutOfMemoryError: Ошибка пространства PermGen с Jetty

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

Но эти решения, кажется, использует Tomcat вместо Jetty. Я продолжаю извлекать из памяти ошибку, если я повторно переустанавливаю мой сервис несколько раз. Например, чтобы проверить это, я перехожу в свою папку webapps и запускаю touch * .xml, чтобы обновить метку времени, а затем повторно запустить jetty, и я получаю ошибку из памяти. В моей папке молов (тот, который включает в себя бункер, док, и т.д., Пб журналов, модули, start.jar) Я бег

java -jar ../start.jar 

Но это дает мне ошибку. Затем я попробовал то, что я читал в других примерах, таких как:

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

или

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

или

-XX:MaxPermSize=128m 

Тогда, когда я иду в Firefox и перейдите к localhost:8080 и обновления, в на терминале я все время получаю ошибку

java.lang.OutOfMemoryError: PermGen space 

ответ

2

Надеюсь, вы сможете избавиться от этих проблем, просто используя свой ClassLoader Leak Prevention library. Существует много разных ошибок, которые могут вызывать подобные утечки памяти, как в вашем собственном коде, так и в сторонних библиотеках. Более подробную информацию о проблеме, ее отслеживании и известных преступниках можно найти в this blog series of mine. В частности, обратите внимание на this bug на сам Jetty, который может вызвать подобные утечки для некоторых версий.

0

Вы можете добавить эти параметры в файл start.ini в домашней папке Jetty. Если justt это не работает, вы можете попробовать установить более высокий MaxPermSize, что-то вроде 1024 м.

4

Там нет ничего, что вы можете сделать, кроме поднимая MaxPermSize на более высокое значение (например, 1024M.):

-XX:MaxPermSize=1024m 

Это общая проблема, и также объясняется в Jetty Documentation - Prevent Memory Leaks разделе:

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

В Jetty 9.2+

В вашем ${jetty.base} каталоге, добавьте конфигурацию модуля + JVM по умолчанию

[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]$ 

Теперь идите редактировать ${jetty.base}/start.ini и настроить свойства, раскомментируйте те вещи, которые вы хотите (не подделать раскомментировать --exec) причала использовать при запуске самого.

Пример:

# --------------------------------------- 
# 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

Это вопрос старше, но это решить мою проблему:

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

Смежные вопросы