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>
Другие вопросы по тегам