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

pal*_*lto 2 java jvm permgen

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

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

我知道这里有两个问题,但如果你能回答一个问题就够了:)

Ste*_*n C 5

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

  1. 在某处,对某个对象的可访问引用,该对象的类已被热部署替换.

  2. 该对象具有对其类描述符的引用.

  3. 类描述符具有对其ClassLoader的引用.

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

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

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

编辑

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

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

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