在Tomcat-Spring-Hibernate Web应用程序中,“PermGen out of space”异常可以做些什么?

2022-09-02 01:12:51

我们有一个Web应用程序,它使用Spring-Hibernate将注册用户数据保存在Oracle数据库中。该应用程序在开发环境中运行良好,但是当我们用更多数据将其复制到实时环境中时,它失败了。最初,应用程序正常启动,但在几次操作后,发生了“PermGen out of space”异常。

我已经开始在Google,Spring和Hibernate论坛上搜索,但这无济于事。关于这个错误有很多讨论,但对于每个解决方案,都有人说:“它有效”,其他人说“它不起作用”。

例如,许多人提出增加JVM参数,其他人说它不起作用。有些帖子说,使用javassist库和其他库以及cglib库的问题需要使用。其他人说问题出在cglib上。-XX:MaxPermSize

我们使用Java1.5_0_09,Spring 2.5与 javaassist3.4.GA,Tomcat 5.5作为Web容器,Oracle 10g作为数据库。

任何人都可以解释一下导致这个问题的原因以及如何解决它?


答案 1

这确实有效,你只需要得到正确的价值。我相信,客户端模式 VM 的默认值为 32mb,服务器模式 VM 的默认值为 64mb。我建议将其设置为256mb,如果您有内存:-XX:MaxPermSize

java -XX:MaxPermSize=256m

出现此问题的原因是 Spring 和 Hibernate 可以大量使用运行时生成的类,有时会有很多。这些生成的类都进入PermGen内存池,因此,如果您使用这些框架,则通常需要将PermGen提升到大量。


答案 2

您必须知道,某些版本的Tomcat在战争重新部署时存在内存泄漏。它发生在我身上 tomcat 6.0.x.

正如建议增加MaxPermSize一样,这是您的开发计算机的临时解决方案 - 当您收到错误时,在2-3天后,只需重新启动服务器即可。在生产上并不是那么简单。因此,这适用于开发,但此方法不适用于生产环境,因为您应该修复内存泄漏问题。

要发现泄漏,请使用jdk 1.6和1.5附带的jconsole应用程序。您可以绑定到进程,并观察随时间推移使用的内存。

您还可以阅读以下内容:


推荐