解决PermGen问题的各种选择

Ric*_*ich 10 java garbage-collection memory-leaks

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

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

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

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

我有两个问题:

  1. 以上是正确的吗?
  2. 哪里做VM选项CMSClassUnloadingEnabled,并CMSPermGenSweepingEnabled来到这个?从我可以看到CMSClassUnloadingEnabled取代或隐含启用CMSPermGenSweepingEnabled.他们中的任何一个都有助于解决上述问题吗?

Ste*_*n C 7

不幸的是,答案是:

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

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

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