Java jBoss 4.0.2多次部署同一个WAR会导致jBoss崩溃,原因是PermGem/内存不足错误

Java jBoss 4.0.2多次部署同一个WAR会导致jBoss崩溃,原因是PermGem/内存不足错误,java,memory-management,jboss,permgen,Java,Memory Management,Jboss,Permgen,我开发web应用程序,使用JBoss4.0.2,当我使用eclipse多次重新部署WAR时,jBoss将崩溃,因为它的内存不足。当我必须在生产环境中安装新版本时,它将消耗生产服务器内存,这意味着我必须停止jBoss,以防止从客户服务器重新部署eat内存。有解决这个问题的方法吗?基本上没有。由于JBoss类加载器的工作方式,每次部署都会消耗一大块PermGen,即使应用程序未部署,也不会释放 您可以通过将PermGen内存池的大小增加到几百兆(甚至千兆),来缓解症状,这使得问题更容易解决。我还发现

我开发web应用程序,使用JBoss4.0.2,当我使用eclipse多次重新部署WAR时,jBoss将崩溃,因为它的内存不足。当我必须在生产环境中安装新版本时,它将消耗生产服务器内存,这意味着我必须停止jBoss,以防止从客户服务器重新部署eat内存。有解决这个问题的方法吗?

基本上没有。由于JBoss类加载器的工作方式,每次部署都会消耗一大块PermGen,即使应用程序未部署,也不会释放

您可以通过将PermGen内存池的大小增加到几百兆(甚至千兆),来缓解症状,这使得问题更容易解决。我还发现,减少代码中静态字段的使用(特别是引用大型对象的静态字段)可以减少对PermGen的影响


理想情况下,我不会在生产中使用热部署,而是关闭服务器,更换WAR/EAR,然后重新启动它。

我不确定它是否链接,但我怀疑它是-JBoss在实现应用程序分离方面并不符合J2EE

实际上,有一个类加载器,所有类都放在其中,因此不可能卸载类,因此您将遇到这个问题。在这方面,您可以将jboss配置为更符合J2EE

您是在使用“内存不足的永久发电机”,还是经常使用内存不足的永久发电机

我还通过将JProfiler连接到它并用它检查内存使用情况取得了进展

最后我只是一直重新启动Jboss,没有占用太多时间。

试试这个(适用于Sun的Java):

-XX:+UseConMarkSweepGC -XX:+cms已启用 -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=128m

CMS实际上可以GC永久生成堆(类所在的堆)。设置MaxPermSize是不必要的,但应用服务器的默认值较低