解决PermGen问题的各种选择

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

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

从我所看到的 ,以下是正确的:

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

我有两个问题:

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

不幸的是,答案是:

  1. 这些VM选项只会推迟问题。

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

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

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