JBoss Weld + java.lang.OutOfMemoryError: PermGen space
Я только что переключился на Weld, чтобы использовать область разговора CDI JSF 2 Beans +.
Вот моя зависимость Maven:
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>1.0.1-Final</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
Вот запись в моем web.xml:
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
Одна вещь, которую я сразу заметил, это то, что мне просто нужно перезагрузить мой Tomcat 7 примерно 2 раза, и java.lang.OutOfMemoryError: PermGen space
будет отображаться в файле журнала catalina.out.
Перед использованием Weld я могу перезагрузить свой tomcat 7 более чем в 10 раз безопаснее без java.lang.OutOfMemoryError . Я думал, что увеличение моего параметра Xmx в catalina.sh поможет, но в моем опыте это не помогло. JAVA_OPTS=-Xmx1024m
Это нормально?
3 ответа
Это действительно очень типичная ошибка, когда вы хотите использовать Java EE с простым контейнером сервлетов, который не предназначен для этого;)
Нет, просто прикалываюсь. Tomcat поставляется с настройкой permgen по умолчанию всего 64 МБ. Среди других Class
определения (то есть, что вы получаете, когда вы делаете Class#forName()
) хранятся там. Грубо говоря, Weld сканирует каждый JAR и класс в classpath, чтобы найти аннотации, чтобы он мог программно создать отображение памяти конфигурации проводки (до аннотаций это обычно выполнялось файлами XML). Однако наличие множества классов в пути к классам и загрузка такого количества классов оставляет очень мало места в постоянном пространстве для горячих развертываний Tomcat.
Есть несколько способов обойти это. Наиболее логичным способом было бы увеличить пространство permgen. Вы можете установить его в качестве аргумента VM. 256 МБ - хорошее начало.
-XX:MaxPermSize=256m
Если вы используете Tomcat из Eclipse, вам нужно установить его, дважды щелкнув запись сервера в представлении " Серверы", щелкнув ссылку " Открыть конфигурацию запуска", перейдя на вкладку " Аргументы ", а затем добавив ее (через пробел) в поле " Аргументы виртуальной машины".
Кроме того, вы также можете заставить JVM быть более экономным с пространством permgen. Объекты там по умолчанию редко выгружаются. Добавьте следующие аргументы VM.
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
Смотрите также:
Попробуйте установить permsize: -XX:MaxPermSize=200m
, Вы, вероятно, загружаете много определений классов и, следовательно, заполняете пространство постоянной генерации.
За исключением увеличения PermGen, вы также должны исключить пакеты, которые не учитывают сварку, из сканера сварки. Посмотреть здесь:
20,1. Исключение классов из сканирования и развертывания
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:weld="http://jboss.org/schema/weld/beans"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee http://docs.jboss.org/cdi/beans_1_0.xsd
http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd">
<weld:scan>
<!-- Don't deploy the classes for the swing app! -->
<weld:exclude name="com.acme.swing.**" />
<!-- Don't include GWT support if GWT is not installed -->
<weld:exclude name="com.acme.gwt.**">
<weld:if-class-available name="!com.google.GWT"/>
</weld:exclude>
<!--
Exclude classes which end in Blether if the system property verbosity is set to low
i.e. java ... -Dverbosity=low
-->
<weld:exclude pattern="^(.*)Blether$">
<weld:if-system-property name="verbosity" value="low"/>
</weld:exclude>
<!--
Don't include JSF support if Wicket classes are present, and the viewlayer system
property is not set
-->
<weld:exclude name="com.acme.jsf.**">
<weld:if-class-available name="org.apahce.wicket.Wicket"/>
<weld:if-system-property name="!viewlayer"/>
</weld:exclude>
</weld:scan>
</beans>