Glassfish/Hibernate的PermGen空间问题

Geo*_*old 6 java memory-leaks permgen classloader glassfish-3

我正在Glassfish 3.1上运行GWT + Hibernate应用程序.几个小时后,我跑出了Permgen空间.这没有任何webapp重新加载.我正在跑步–XX:MaxPermSize=256m –XmX1024m.

我接受了这个页面的建议,发现我泄漏了很多类 - 我所有的Hibernate模型和所有的GWT RequestFactory代理.

上面引用的指南说"检查链条,找到意外参考,并修复代码".说起来容易做起来难.

类加载器总是指向一个实例org.glassfish.web.loader.WebappClassLoader.进一步挖掘,我发现了许多来自$Proxy135和类似命名对象的引用.但我不知道还有什么可以贯彻的.

Dea*_*mer 22

新的类对象被放入PermGen中,从而占用越来越多的空间.无论你制作PermGen空间有多大,它都将在经过足够的部署后不可避免地达到顶峰.你需要做的是采取措施冲洗PermGen,以便你可以稳定它的大小.有两个JVM标志可以处理这种清理:

-XX:+CMSPermGenSweepingEnabled
Run Code Online (Sandbox Code Playgroud)

此设置包括垃圾收集运行中的PermGen.默认情况下,PermGen空间永远不会包含在垃圾收集中(因此无边界地增长).

-XX:+CMSClassUnloadingEnabled
Run Code Online (Sandbox Code Playgroud)

此设置告诉PermGen垃圾收集扫描对类对象执行操作.默认情况下,即使在garabage集合期间访问PermGen空间时,类对象也会获得免除.


Geo*_*old 4

我通过迁移到 Tomcat“解决”了这个问题。