我有一个在 Tomcat 6.0.35 上运行的 Web 应用程序,它使用 Spring 3.1.2、Hibernate 4.1.8 和 MySQL Connector 5.1.21。
在几次重新部署后,我一直试图找出导致 Tomcat 内存不足(Perm Gen)的原因。
注意:不要告诉我增加Tomcat的JVM内存,因为那样只会推迟,问题
具体来说,我使用了 VisualVM 工具,并且能够消除一些问题,包括一些 mysql 和 google 线程问题。我还能够发现并修复由于在 Web 应用程序中使用 Velocity 作为单例而导致的问题,并且也没有在正确的时间/位置关闭我拥有的一些线程局部变量。但我仍然不能完全消除/找出这个休眠问题。
这是我正在做的事情:
- 从我的开发 IDE 部署我的 webapp
- 在我的浏览器中打开一个 tomcat 管理器窗口
- 启动 VisualVM 并获取 tomcat 实例上的 HeapDump
- 去tomcat管理器并重新部署我的webapp
- 在 VisualVM 中使用另一个 HeapDump
我的第一个观察是原始 webapp 的 WebappClassLoader 没有被垃圾收集。
当我检查来自第二个 HeapDump 的保留对象时,org.hibernate.internal.SessionFactoryImpl 类具有显着的特征,这让我相信它没有被 Spring 或类似的东西破坏/关闭(因此 WebappClassLoader 仍然有一个参考它)。
有没有人遇到过这个问题并确定了正确的解决方法?