Tomcat-Spring-Hibernate Web应用程序中的"PermGen out of space"异常可以做些什么?

22 java spring hibernate permgen tomcat5.5

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

我已经开始在Google,Spring和Hibernate论坛上搜索,但它没有帮助.关于这个错误有很多讨论,但是对于每个解决方案,都有人说:"它有效"而其他人说'它没有'.

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

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

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

ska*_*man 19

-XX:MaxPermSize不工作,你刚刚得到正确的值.我相信默认情况下,客户端模式VM为32mb,服务器模式VM为64mb.如果你有记忆,我建议把它设置为256mb:

java -XX:MaxPermSize=256m
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,这只会延迟问题.如果您的应用程序定期生成类,则必须时不时地重新启动服务器. (11认同)

Mer*_*ste 8

您必须意识到某些版本的Tomcat在战争重新部署时存在内存泄漏.它发生在tomcat 6.0.x上.

如建议增加MaxPermSize,这是您的开发机器的临时解决方案 - 当您收到错误时,2-3天后,只需重新启动服务器.生产并不那么简单.所以这适用于开发,但这种方法不适用于生产,你应该修复内存泄漏问题.

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

你也可以阅读这些: