解决PermGen问题的各种选项

10

我正在研究Java 6 18 VM环境下垃圾回收的各种选项,并希望得到一些指引。

我们的应用程序在JBoss上运行,有时会出现著名的PermGen错误,在互联网上关于解决或减轻这个问题的最佳方法存在许多相互冲突和过时的信息。

我所见,如下是正确的:

  • 仅依靠VM选项无法解决此问题,只能拖延解决时间。
  • 修复编码错误是解决此问题的唯一可靠方法,可以在应用程序服务器本身中(不太可能)或正在应用程序服务器中运行的代码(我们的代码或第三方库)中进行修复。填充Permgen通常是应用程序类加载器加载的对象与应用程序服务器类加载器加载的对象之间相互引用导致的,从而防止应用程序类加载器的垃圾回收。

由此产生了两个问题:

  1. 以上是否正确?
  2. VM选项CMSClassUnloadingEnabledCMSPermGenSweepingEnabled在这方面有什么作用?从我所看到的,CMSClassUnloadingEnabled覆盖或隐式启用CMSPermGenSweepingEnabled。它们中的任何一个是否有助于解决上述问题?
2个回答

7

很遗憾,答案是:

  1. 那些虚拟机选项只会推迟问题。

基本问题在于GC不会回收强可达对象。 你需要找出为什么旧的应用程序类加载器在重新部署后仍然可到达,并修复漏洞。

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


1
在生产服务器上禁用热部署是个好习惯。实际上,我倾向于对所有环境都这样做,除了开发者的工作站环境。 - Joshua Davis

1

谢谢提供链接 - 那篇文章是我在原始帖子中提到的,但是在另一个网站上。 - Rich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接