We have an web application that uses Spring-Hibernate to persist registered users data in Oracle database. The application works fine in development environment, but when we
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:
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.
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.
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.
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.