这是我一直有的老问题。我想在开发环境中重新部署。在一些部署之后,我用完了 permgen 并且不得不终止服务器。多年前,我试图找到解决问题的方法,但发现 Spring 和 Hibernate 互相指责该问题。有没有找到解决办法?
Spring Roo 声称它不会在运行时生成类,因此不会有问题。它真的有效吗?如果有效,我该如何配置我的应用程序?
我知道这里有两个问题,但如果你能回答一个就足够了:)
据我了解,典型的 PermGen 存储泄漏是这样的。
某处存在对某个对象的可访问引用,该对象的类已被热部署替换。
该对象具有对其类描述符的引用。
类描述符具有对其 ClassLoader 的引用。
ClassLoader 具有对它已加载的所有类的类描述符的引用。
每个类描述符都有对类静态框架、其字节码、其本机代码等的引用。
仅对一个对象的一次引用就足以导致 permgen 泄漏。如果可以是一个枚举值,一个尚未取消注册的侦听器,...
编辑
遇到此问题的人通常采取的做法是耸耸肩并增加 PermGen 堆大小。如果您确实需要为您的 Web 应用程序解决问题,那么:
I don't know if there are specific issues with Hibernate, but any complicated framework is potentially susceptible to this kind of problem, either on its own or in combination with application code.
If you are running your application under linux, running your application with the IBM JRE will solve this issue.
有几件事可以帮助解决这个问题。Spring 有一个“IntrospectionCleanupListener”可以提供一点帮助。如果您在 Web 应用程序中加载和创建 JDBC 连接,您可以拥有一个 servlet 上下文侦听器,它将取消注册您在应用程序中加载的驱动程序。这些有帮助,但不能完全解决问题。