我开发 Web 应用程序并使用 jBoss 4.0.2,当我用 eclipse 重新部署我的 WAR 多次时,jBoss 会因为内存不足而崩溃。而且当我必须在生产环境中安装新版本时,它会消耗生产服务器的内存,这意味着我必须停止 jBoss 以防止从客户服务器重新部署吃内存。有没有解决这个问题的方法?
3 回答
基本上,没有。由于 JBoss 类加载器的工作方式,每次部署都会使用一块 PermGen,即使取消部署应用程序也不会释放。
您可以通过将 PermGen 内存池大小增加到数百兆(甚至 gig)来缓解症状,这使问题更容易解决。我还发现减少代码中静态字段的使用(尤其是引用大对象的静态字段)可以减少对 PermGen 的影响。
理想情况下,我不会在生产中使用热部署,而是关闭服务器,更换 WAR/EAR,然后重新启动它。
试试这个(适用于 Sun 的 Java):
-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=128m
CMS 实际上可以 GC 永久代堆(您的类所在的堆)。设置 MaxPermSize 是不必要的,但对于应用程序服务器,默认值较低。
我不确定它是否链接,但我怀疑它是 - JBoss 不兼容 J2EE,因为它开箱即用地实现应用程序分离。
随之而来的是,有一个类加载器可以将所有类都放入其中,因此无法卸载类,因此您将遇到此问题。在这方面,您可以将 jboss 配置为更符合 J2EE。
您是在“内存不足 Permgen”还是经常内存不足?
我还通过将 JProfiler 连接到它并用它检查内存使用情况取得了进展。
我最终只是一直重新启动 Jboss - 并没有占用太多时间。