代码之家  ›  专栏  ›  技术社区  ›  Rich

解决PermGen问题的各种选择

  •  10
  • Rich  · 技术社区  · 16 年前

    我正在研究Java 6 18 VM周围的垃圾收集的各种选项,并希望有一些指针。

    我们在JBoss上运行我们的应用程序,有时在重新部署期间会出现臭名昭著的permgen错误。互联网上有很多冲突和过时的信息,关于解决或缓解这个问题的最佳方法。

    what I can see ,以下是正确的:

    • 自己的虚拟机选项 无法解决此问题 只会推迟。
    • 解决此问题的唯一可靠方法是修复应用服务器本身(不太可能)或应用服务器中运行的代码(我们的代码或第三方库)(更可能)中的编码错误。PermGen的填充通常是从应用程序类加载器加载的对象到应用程序服务器类加载器加载的对象的引用的结果,从而防止应用程序类加载器的垃圾收集。

    由此我有两个问题:

    1. 以上是否正确?
    2. 虚拟机选项在哪里 CMSClassUnloadingEnabled CMSPermGenSweepingEnabled 来这里?据我所见 CMSClassUnloadingEnabled(CMSClassUnloadingEnabled(CMSClassUnloadingEnabled))。 替换或隐式启用 CMSPermgensuperinginabled公司 . 他们中的任何一个对上述问题有帮助吗?
    2 回复  |  直到 14 年前
        1
  •  7
  •   Stephen C    16 年前

    不幸的是,答案是:

    1. 是的
    2. 这些虚拟机选项只会推迟问题的发生。

    基本问题是GC不会垃圾收集一个强可访问的对象。您需要弄清楚为什么在重新部署之后仍然可以访问那些旧的应用程序类加载器…修复漏洞。

    或者,放弃在生产服务器上的热重新部署,或者更频繁地重新启动Web容器(例如jboss)。

        2
  •  1
  •   Martin Vysny    16 年前

    阅读时间长但很好: http://victor-jan.blogspot.com/2010/05/classloader-leaks-dreaded.html 简而言之,它是可解的。不容易,但可以解决。