JBoss Weld + java.lang.OutOfMemoryError: PermGen space - PullRequest
13 голосов
/ 04 апреля 2011

Я только что переключился на 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 ]

5 голосов
/ 04 апреля 2011

Это действительно очень типичная ошибка, когда вы хотите использовать Java EE с простым контейнером сервлетов, который не предназначен для этого;)

Нет, просто шучу. Tomcat поставляется с настройкой по умолчанию permgen всего 64 МБ. Среди прочего там хранятся определения Class (т. Е. Все, что вы получаете, когда делаете Class#forName()). Грубо говоря, Weld сканирует каждый один JAR и класс в classpath, чтобы найти аннотации, чтобы он мог программно создать отображение памяти конфигурации проводки (до аннотаций это обычно выполнялось файлами XML). Однако наличие множества классов в пути к классам и загрузка такого количества классов оставляет очень мало места в постоянном пространстве для горячих развертываний Tomcat.

Есть несколько способов обойти это. Наиболее логичным способом было бы увеличить пространство permgen. Вы можете установить его в качестве аргумента VM. 256 МБ - хорошее начало.

-XX:MaxPermSize=256m

Если вы используете Tomcat из Eclipse, вам необходимо установить его, дважды щелкнув запись сервера в представлении Серверы , щелкнув Открыть конфигурацию запуска , щелкнув Аргументы , а затем добавьте ее (через пробел) в поле VM Arguments .

Кроме того, вы также можете заставить JVM быть более осторожным с пространством permgen. Объекты там по умолчанию редко выгружаются. Добавьте следующие аргументы VM.

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

Смотри также:

1 голос
/ 08 мая 2011

Кроме увеличения 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>
1 голос
/ 04 апреля 2011

Попробуйте установить значение permsize: -XX:MaxPermSize=200m. Вы, вероятно, загружаете много определений классов и, следовательно, заполняете пространство постоянной генерации.

...