在多次重新部署后,应用程序因 PermGen 错误而崩溃。我知道增加 permgen 大小的变通方法。但我试图揭示泄漏的原因。重新部署后,我使用 jvisualvm 进行堆转储并搜索 WebAppClassLoader 的实例。正如预期的那样,有一个不是 GC-ed。显示最近的 GC 根点到 platformMBeanServer(MangementFactory 类型)。所以问题是我能用它做什么?
还有一些额外的信息。我的 jdbc 驱动程序 jar 位于 tomcat 的 lib 目录和 bin 目录中的 .dll 文件中。当我评论 hibernate sessionFactory creation - 问题消失。 session 工厂在servlet filter的init方法中创建,在destroy方法中关闭。 Hibernate 使用 c3p0 连接池。
最佳答案
您可以尝试添加这些 Java 选项:
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
这会在 PermGen 空间中启用垃圾收集(默认情况下关闭)并允许 GC 卸载类。
关于java - Web应用程序中的内存泄漏,tomcat+hibernate+Guice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22168348/