【问题标题】:The various options for solving PermGen problems解决 PermGen 问题的各种选项
【发布时间】:2011-03-21 00:20:24
【问题描述】:

我正在研究围绕 Java 6 18 VM 上的垃圾收集的各种选项,并希望得到一些指导。

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

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

  • 单独的 VM 选项无法解决此问题,只能推迟。
  • 解决此问题的唯一可靠方法是修复应用程序服务器本身(不太可能)或应用程序服务器中运行的代码(我们的代码或第三方库)中的编码错误(更有可能)。 Permgen 的填充通常是应用类加载器加载的对象对 Application Server 类加载器加载的对象的引用的结果,从而阻止了应用程序类加载器的垃圾回收。

我有两个问题由此产生:

  1. 以上是否正确?
  2. VM 选项CMSClassUnloadingEnabledCMSPermGenSweepingEnabled 在哪里出现?从我可以看到CMSClassUnloadingEnabled 取代或隐式启用CMSPermGenSweepingEnabled。他们中的任何一个都有助于解决上述问题吗?

【问题讨论】:

    标签: java memory-leaks garbage-collection


    【解决方案1】:

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

    【讨论】:

    • 感谢您的链接 - 这是我在原始帖子中链接到的文章,但在另一个网站上。
    【解决方案2】:

    很遗憾,答案是:

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

    基本问题是 GC 不会对强可达对象进行垃圾收集。你需要弄清楚为什么那些旧的应用程序类加载器在重新部署后仍然可以访问......并修复泄漏。

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

    【讨论】:

    • +1 在生产服务器上禁用热部署。实际上,除了开发人员工作站环境之外,我倾向于对所有东西都这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2011-06-23
    • 2016-10-23
    相关资源
    最近更新 更多