这是我一直以来的一个老问题。我想在开发环境中重新部署。在一些部署后,我用完permgen并且必须杀死服务器。多年前我试图找到问题的解决方案,但刚刚发现Spring和Hibernate互相指责问题。有没有找到解决方案?
Spring Roo声称它不会在运行时生成类,所以它不会成为问题。它是否真的有用,如果确实如此,我该如何配置我的应用程序呢?
我意识到这里有两个问题,但如果你能回答一个问题就足够了:)
答案 0 :(得分:5)
据我了解,典型的PermGen存储泄漏是这样的。
某处某个对象的可访问引用,该对象的类已被热部署取代。
该对象引用了其类描述符。
类描述符引用了ClassLoader。
ClassLoader引用了已加载的所有类的类描述符。
每个类描述符都引用了类静态帧,其字节码,本机代码等。
只有一个对象的引用足以导致permgen泄漏。如果可能是一个枚举值,一个尚未注册的监听器,......
修改强>
遇到此问题的人采取的正常方法是耸肩并增加PermGen堆大小。如果您确实需要解决Web应用程序的问题,那么:
我不知道Hibernate是否存在特定问题,但任何复杂的框架都可能会受到此类问题的影响,无论是单独使用还是与应用程序代码结合使用。
答案 1 :(得分:2)
如果您在linux下运行您的应用程序,使用IBM JRE运行您的应用程序将解决此问题。
答案 2 :(得分:0)
有些事情可以帮助解决这个问题。 Spring有一个“IntrospectionCleanupListener”可以帮助一点。如果要在Web应用程序中加载和创建JDBC连接,则可以使用servlet上下文侦听器来取消注册应用程序中加载的驱动程序。这些有帮助,但并不能完全解决问题。