JBoss焊接&x2B;java.lang.OutOfMemoryError:PermGen空间

JBoss焊接&x2B;java.lang.OutOfMemoryError:PermGen空间,java,jsf,jsf-2,cdi,jboss-weld,Java,Jsf,Jsf 2,Cdi,Jboss Weld,我刚刚切换到Weld来使用CDI JSF 2 Beans+对话范围 以下是我对maven的依赖: <dependency> <groupId>org.jboss.weld.servlet</groupId> <artifactId>weld-servlet</artifactId> <version>1.0.1-Final</version>

我刚刚切换到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>

org.jboss.weld.servlet
焊接servlet
1.0.1-最终版本
罐子
编译
以下是my web.xml中的条目:

<listener>
  <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>

org.jboss.weld.environment.servlet.Listener
我立即注意到的一件事是,我只需要重新加载tomcat 7两次,而
java.lang.OutOfMemoryError:PermGen space
将显示在catalina.out日志文件中


在使用Weld之前,我可以在没有java.lang.OutOfMemoryError的情况下安全地重新加载tomcat 7 10次以上。我原以为在catalina.sh中增加Xmx选项会有所帮助,但以我的经验,这并没有起到作用<代码>JAVA_OPTS=-Xmx1024m


这正常吗?

尝试设置permsize:
-XX:MaxPermSize=200m
。您可能正在加载大量的类定义,因此填充了永久的生成空间

这确实是一个非常典型的错误,当您想要使用一个简单的servletcontainer(它不是为此而设计的)进行JavaEE时;)

不,只是开玩笑。Tomcat附带的默认permgen设置只有64MB。其中,
定义(即执行
类#forName()
时得到的任何内容)存储在那里。粗略地说,Weld扫描类路径中的每个JAR和类以找到注释,这样它就可以通过编程创建布线配置的内存映射(在注释之前,这通常是通过XML文件实现的)。然而,在类路径中有很多类,并且加载了那么多的类,在permgen空间中为Tomcat的热部署留下了很少的空间

有几种方法可以解决这个问题。最合乎逻辑的方法是增加永久发电机空间。可以将其设置为VM参数。256MB是一个良好的开端

-XX:MaxPermSize=256m
如果您是从Eclipse内部使用Tomcat,则需要通过双击Servers视图中的server条目、单击OpenLaunchConfiguration链接、单击Arguments选项卡,然后将其(以空格分隔)添加到VM Arguments字段来进行设置

此外,您还可以强制JVM更节省地使用permgen空间。默认情况下,其中的对象很少卸载。添加以下VM参数

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
另见:

除了增加PermGen外,您还应该从焊缝扫描仪中排除不了解焊缝的包裹。请看这里:



这当然不正常。但是除非你在代码中做一些挖掘并找到消耗内存的部分,否则绝对不可能确定是你的代码还是实现本身…@jan groth:我不认为这是我的代码,因为这是一个非常简单的测试项目,比如带计数器的jsf bean等等。在使用weld之前,我使用的是spring或默认的jsf托管bean,它们都很好。
JAVA\u OPTS=-Xmx1024m
不会增加Permgen<代码>-XX:MaxPermSize=256m没有。
<?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>