2010-10-11 47 views
2

这是我一直以来的老问题。我想在开发环境中重新部署。经过一些部署后,我耗尽了permgen,不得不杀掉服务器。多年前我试图找到解决问题的办法,但发现Spring和Hibernate相互指责这个问题。有没有找到解决方案?重新部署时,是否仍然无法摆脱PermgenSpace异常?

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

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

+1

只是增加服务器的永久空间 – 2010-10-11 13:13:03

+1

是的,这一直是“解决方案”,我不满意。它不能解决问题。 – palto 2010-10-11 13:18:34

回答

2

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

+0

IBM JRE是否支持Java 6?看起来像他们只支持高达1.5 – palto 2010-10-18 06:30:47

+0

是的,它的确如此:请参阅https://www.ibm.com/developerworks/java/jdk/linux/download.html – 2011-01-15 08:08:20

0

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

5

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

  1. 某处存在对某些对象的可达引用,该对象的类已被热部署取代。

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

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

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

  5. 每个类描述符都具有对静态帧,其字节码,其本地代码等的引用。

对一个物体的一个引用足以导致泄漏泄漏。如果可能是一个枚举值,听众还没有被注册,...

编辑

由谁遇到这样的问题是耸耸肩膀,增加PermGen的堆人所采取的惯常做法尺寸。如果你真的需要解决这个问题为您的Web应用程序(一个或多个),然后:

  • 看看你的web应用程序关闭,确保数据库连接/连接池被关闭,一路回调未登记,等
  • 使用Java内存分析器跟踪由重新部署触发的PermGen(和其他)内存泄漏。
  • 准备好重复这个过程,如果新的泄漏是随着你的webapp的发展而引入的。

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

+0

你是否知道在使用Hibernate时总会发生这种情况,还是我可能犯的一个错误?有没有办法来检测这些泄漏? – palto 2010-10-11 18:16:00