What can be done with 'PermGen out of space' exception in Tomcat-Spring-Hibernate web application?

≯℡__Kan透↙ 提交于 2019-11-27 19:24:24

The -XX:MaxPermSize does work, you've just got to get the right value. The default, I believe, is 32mb for t the client-mode VM, and 64mb for the server mode VM. I suggest setting it to 256mb, if you have the memory:

java -XX:MaxPermSize=256m

The problem occurs because Spring and Hibernate can make heavy use of runtime-generated classes, sometimes a lot of them. These generated classes all go into the PermGen memory pool, so if you use those frameworks, you often need to boost your PermGen to large amounts.

Mercer Traieste

You must be aware that some versions of Tomcat have memory leaks on war redeployment. It happened to me on tomcat 6.0.x.

As suggested increase the MaxPermSize, this is a temporary solution for your development machine - and when you get the error, after 2-3 days, just restart the server. On production is not that simple. So this works for development, but this approach doesn't work for production, where you should have the memory leaks issues fixed.

To discover the leaks use the jconsole application that comes with jdk 1.6 and 1.5. You can bind to a process, and watch memory used over time.

You can also read these:

I have seen this problem with Hibernate (used without Spring). The issue there was that we were creating an instance of a SessionFactory for each user request rather than creating a single instance for the lifetime of the application.

I used the YourKit profiler to investigate this and discover the issue.

As skaffman says the -XX:MaxPermSize property does work, however sometimes you can have an underlying problem that upping the limit may only defer.

Have you seen this note? It helped me resolve a similar problem once. To summarise the link:

  • Put JDBC driver in common/lib (as tomcat documentation says) and not in WEB-INF/lib
  • Don't put commons-logging into WEB-INF/lib since tomcat already bootstraps it

Visual GC, now part of JDK 6, gives a very nice graphical representation of memory in real time. You can see what's happening to eden, generational, and perm spaces. You just won't see why.

UPDATE: It's bin/jvisualvm.exe in my JDK 1.6.0_13 distro. Give it the PID of the process you want to monitor.

All responses here relates to PermGen problem that happens because of several restarts of web-app, but in this case the problem already happens on first deployment after tomcat restart, so it can't be the problem of ClassLoader's references or commons-logging.

If you're running on jdk6 then you can use the jconsole app to monitor the memory usage of the application and investigate further.

Another avenue to pursue is to use a profiler, I use JProfiler, and take a look at the application with that. It will tell you exactly where the problem is coming from.

I ran in the same problem, and I've read that Tomcat is the culprit in this situation.

Then I switched to jetty instead and everything turned out great, and the app deploys/runs as expected. So if tomcat is not a must, then I'd suggest Jetty.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!