在重新部署时,是否仍然无法摆脱PermgenSpace异常?

时间:2010-10-11 13:09:01

标签: java jvm permgen

这是我一直以来的一个老问题。我想在开发环境中重新部署。在一些部署后,我用完permgen并且必须杀死服务器。多年前我试图找到问题的解决方案,但刚刚发现Spring和Hibernate互相指责问题。有没有找到解决方案?

Spring Roo声称它不会在运行时生成类,所以它不会成为问题。它是否真的有用,如果确实如此,我该如何配置我的应用程序呢?

我意识到这里有两个问题,但如果你能回答一个问题就足够了:)

3 个答案:

答案 0 :(得分:5)

据我了解,典型的PermGen存储泄漏是这样的。

  1. 某处某个对象的可访问引用,该对象的类已被热部署取代。

  2. 该对象引用了其类描述符。

  3. 类描述符引用了ClassLoader。

  4. ClassLoader引用了已加载的所有类的类描述符。

  5. 每个类描述符都引用了类静态帧,其字节码,本机代码等。

  6. 只有一个对象的引用足以导致permgen泄漏。如果可能是一个枚举值,一个尚未注册的监听器,......

    修改

    遇到此问题的人采取的正常方法是耸肩并增加PermGen堆大小。如果您确实需要解决Web应用程序的问题,那么:

    • 查看您的webapp关闭的方式,确保关闭数据库连接/连接池,取消注册所有回调等。
    • 使用Java内存分析器跟踪由重新部署触发的PermGen(和其他)内存泄漏。
    • 如果随着webapp的发展而引入新的泄漏,请准备好重复此过程。

    我不知道Hibernate是否存在特定问题,但任何复杂的框架都可能会受到此类问题的影响,无论是单独使用还是与应用程序代码结合使用。

答案 1 :(得分:2)

如果您在linux下运行您的应用程序,使用IBM JRE运行您的应用程序将解决此问题。

答案 2 :(得分:0)

有些事情可以帮助解决这个问题。 Spring有一个“IntrospectionCleanupListener”可以帮助一点。如果要在Web应用程序中加载和创建JDBC连接,则可以使用servlet上下文侦听器来取消注册应用程序中加载的驱动程序。这些有帮助,但并不能完全解决问题。