解决PermGen问题的各种选择
我正在研究Java 6 18 VM上垃圾收集的各种选项,并希望得到一些指示。
我们在JBoss上运行我们的应用程序,偶尔在重新部署期间会出现臭名昭着的PermGen错误。 互联网上有很多相互矛盾和过时的信息,说明解决或缓解这个问题的最佳方法。
从我所看到的 ,以下是正确的:
- VM选项本身无法解决此问题 ,只能推迟它。
- 解决此问题的唯一可靠方法是修复Application Server本身(不太可能)或Application Server中运行的代码(我们的代码或第三方库)(更有可能)中的编码错误。 Permgen的填充通常是应用程序类加载器加载到Application Server类加载器加载的对象的引用的结果,从而防止应用程序的类加载器的垃圾收集。
我有两个问题:
- 以上是正确的吗?
- VM选项
CMSClassUnloadingEnabled
和CMSPermGenSweepingEnabled
哪里进入此区域? 从我所看到的CMSClassUnloadingEnabled
取代或隐式启用CMSPermGenSweepingEnabled
。 他们中的任何一个都有助于解决上述问题吗?
不幸的是,答案是:
- 是
- 这些VM选项只会推迟问题。
基本问题是GC不会垃圾收集强可达对象。 您需要弄清楚为什么在重新部署后仍然可以访问那些旧的应用程序类加载器…并修复泄漏。
或者,放弃在生产服务器上进行热重新部署,或者更频繁地重新启动Web容器(例如JBoss)。
很长但很好的阅读: http : //victor-jan.blogspot.com/2010/05/classloader-leaks-dreaded.html简而言之,它是可以解决的。 不容易,但可以解决。
- 使用Java 7进行转义分析/堆栈分配的资格
- 资源泄漏:使用Apache.POI XSSFWorkbook时,工作簿永远不会被关闭
- 缓存()/ persist()的apache-spark内存消耗
- 是否可以创建堆转储以分析内存泄漏而无需垃圾回收?
- Java运行时环境检测到致命错误:pc = 0x00002b2f7e9b2744处的SIGSEGV(0xb),pid = 28778,tid = 1138739520
- Java中垃圾收集的合格变量
- 在java 9中处理PrintGCApplicationStoppedTime标志
- 超出范围时,ExecutorService是否会收集垃圾?
- 诊断Java内存问题的策略