13

CDI JSF 2 Beans + 会話スコープを利用するために Weld に切り替えました。

これが私の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>

すぐに気づいたことの 1 つは、Tomcat 7 を 2 回ほどリロードするだけjava.lang.OutOfMemoryError: PermGen spaceで、catalina.out ログ ファイルに表示されることです。

Weld を使用する前に、java.lang.OutOfMemoryError がなくても Tomcat 7 を 10 回以上安全にリロードできます。catalina.sh で Xmx オプションを増やすと役立つと思いましたが、私の経験ではそうではありませんでした。JAVA_OPTS=-Xmx1024m

これは正常ですか?

4

3 に答える 3

5

これは、Java EE 用に設計されていない単純な servletcontainer を使用して Java EE に移行したい場合の非常に典型的なエラーです ;)

いや、冗談よ。Tomcat は、デフォルトの permgen 設定が 64MB のみで出荷されます。とりわけ、Class定義 (つまり、実行時に得られるものClass#forName()) はそこに保存されます。大まかに言えば、Weldはクラスパス内のすべての JAR とクラスをスキャンして注釈を見つけ、配線構成のメモリ マッピングをプログラムで作成できるようにします (注釈の前に、これは通常 XML ファイルによって実現されていました)。ただし、クラスパスに多くのクラスがあり、その多くのクラスをロードすると、Tomcat の hotdeploy 用の permgen スペースにほとんど余裕がなくなります。

これを回避するにはいくつかの方法があります。最も論理的な方法は、permgen スペースを増やすことです。VM 引数として設定できます。256MB は良いスタートです。

-XX:MaxPermSize=256m

Eclipse 内から Tomcat を使用している場合は、[サーバー] ビューでサーバー エントリをダブルクリックし、[起動構成を開く] リンクをクリックし、[引数] タブをクリックして、[VM 引数] フィールドに (スペース区切りで) 追加することにより設定する必要あります。

さらに、JVM を permgen スペースでより控えめにすることもできます。そこにあるオブジェクトは、デフォルトではめったにアンロードされません。次の VM 引数を追加します。

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

以下も参照してください。

于 2011-04-04T12:37:22.900 に答える
1

permsize: を設定してみてください-XX:MaxPermSize=200m。おそらく多くのクラス定義をロードしているため、永続的な世代スペースがいっぱいになっています。

于 2011-04-04T07:13:46.040 に答える
1

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>
于 2011-05-08T08:00:51.820 に答える