java - Glassfish/Hibernate 的 PermGen 空间问题

标签 java memory-leaks classloader glassfish-3 permgen

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

我听取了 this page 的建议,并发现我正在泄漏大量类——我所有的 Hibernate 模型和我所有的 GWT RequestFactory 代理。

上面引用的指南说“检查链,找到意外引用,并修复代码”。说起来容易做起来难。

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

最佳答案

新的类对象被放置到 PermGen 中,因此占用的空间量不断增加。无论您将 PermGen 空间设置得有多大,在足够的部署之后它都不可避免地会达到顶峰。您需要做的是采取措施刷新 PermGen,以便您可以稳定其大小。有两个 JVM 标志可以处理这种清理:

-XX:+CMSPermGenSweepingEnabled

此设置包括垃圾收集运行中的 PermGen。默认情况下,PermGen 空间从不包含在垃圾回收中(因此无限增长)。

-XX:+CMSClassUnloadingEnabled

这个设置告诉 PermGen 垃圾收集扫描对类对象采取行动。默认情况下,类对象获得豁免,即使在垃圾回收期间访问 PermGen 空间也是如此。

关于java - Glassfish/Hibernate 的 PermGen 空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5509378/

相关文章:

java - 如何从 JAR 应用程序中动态加载类以在另一个 JAR 中使用?

java - Spring Boot 。如何测试http协议(protocol)版本?

java - Servlet:sendRedirect 重定向到错误的 url?

java - 使用 Bloomberg API 绘制历史最新价格图表

iphone - 仪器中的内存泄漏

java - jstat 过多 "Class Loader Time"

Java 详细类加载

java 简单日期格式

c++ - Windows下GNU C/C++内存泄漏检测

c++ - boost 共享指针和内存管理