java - JBoss 焊接 + java.lang.OutOfMemoryError : PermGen space

标签 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>
        <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

这正常吗?

最佳答案

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

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

有几种方法可以解决这个问题。最合乎逻辑的方法是增加 permgen 空间。您可以将其设置为 VM 参数。 256MB 是一个好的开始。

-XX:MaxPermSize=256m

如果您从 Eclipse 中使用 Tomcat,则需要通过双击Servers View 中的服务器条目,单击打开启动配置链接,单击Arguments 选项卡,然后将其添加(以空格分隔)到 VM Arguments 字段。

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

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

另见:

关于java - JBoss 焊接 + java.lang.OutOfMemoryError : PermGen space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5535408/

相关文章:

java - 为什么 Set 在 webflow 和 Primefaces 中不起作用

java - 无法在 Intellij Idea 中运行简单的 JSF 项目

jsf-2 - readOnlyInput 在 p :calendar primefaces 中不起作用

java - 比较泛型类型 E 节点对象

java - 扩展内部接口(interface)?

java - Jframe java 中没有内容

java - 如何为 Action 监听器编写 JUnit?

java - 为什么在这种情况下向下转型会抛出 ClassCastException?

jsf-2 - Primefaces的p :dataTable?中rowKey属性有什么用

JSF selectBooleanCheckbox required=true 不验证复选框是否被选中