gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:20 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com