13

我刚刚切换到 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 之前,我可以在没有 java.lang.OutOfMemoryError 的情况下安全地重新加载我的 tomcat 7 超过 10 次。我认为在 catalina.sh 中增加我的 Xmx 选项会有所帮助,但在我的经验中并没有。JAVA_OPTS=-Xmx1024m

这是正常的吗?

4

3 回答 3

5

当您想使用不是为此而设计的简单 servletcontainer 使用 Java EE 时,这确实是一个非常典型的错误;)

不只是在开玩笑。Tomcat 附带的默认 permgen 设置仅为 64MB。除其他外,Class定义(即当你做的任何事情Class#forName())都存储在那里。粗略地说,Weld 扫描类路径中的每个JAR 和类以查找注释,以便它可以以编程方式创建连接配置的内存映射(在注释之前,这通常由 XML 文件实现)。但是,在类路径中有许多类并加载了那么多类,在 permgen 空间中为 Tomcat 的热部署留下了很小的空间。

有几种方法可以解决这个问题。最合乎逻辑的方法是增加永久空间。您可以将其设置为 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,您还应该从 Weld 扫描仪中排除不支持焊接的包。看这里:

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 回答