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