4

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

4

3 回答 3

5

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

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

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

于 2009-08-20T15:48:03.840 回答
0

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

-XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=128m

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

于 2009-08-22T09:29:02.190 回答
0

我不确定它是否链接,但我怀疑它是 - JBoss 不兼容 J2EE,因为它开箱即用地实现应用程序分离。

随之而来的是,有一个类加载器可以将所有类都放入其中,因此无法卸载类,因此您将遇到此问题。在这方面,您可以将 jboss 配置为更符合 J2EE。

您是在“内存不足 Permgen”还是经常内存不足?

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

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

于 2009-08-20T16:43:23.807 回答