Note that there are some explanatory texts on larger screens.

plurals
  1. POOut of Memory on Tomcat Shutdown
    text
    copied!<p>Short description of my problem: I start up Tomcat with my deployed Wicket application. When I want to shut down tomcat I get this error message:</p> <pre><code>Error occurred during initialization of VM java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:640) at java.lang.ref.Reference.&lt;clinit&gt;(Reference.java:145) </code></pre> <p>I am running the following setup:</p> <ul> <li>Ubuntu Linux: 10.04 (lucid) with a 2.6.18-028stab094.3 kernel</li> <li>Java Version: "1.6.0_26" Java HotSpot(TM) 64-Bit Server VM </li> <li>Tomcat Version: 7.0.23</li> <li>jvm_args: -Xms512m -Xmx512m -XX:MaxPermSize=205m (these are added via CATALINA_OPTS, nothing else)</li> <li>Wicket 1.5.1</li> <li>Tomcat is configured with two virtual hosts on subdomains with ModProxy</li> <li>My application is deployed as ROOT.war in the appbase directory (it makes no difference if I deploy one or both applications)</li> <li>'''No application deployed does not result in OOM on shutdown''', unless I mess around with the jvm args</li> <li>The size of the war is about 500k, all libraries are deployed in tomcat/common/lib (directory which I added to common.loader in conf/catalina.properties)</li> <li>ulimit -u -> unlimited</li> </ul> <p>When I check the Tomcat manager app it says the following about the JVM memory:</p> <pre><code>Free memory: 470.70 MB Total memory: 490.68 MB Max memory: 490.68 MB (http connector) Max threads: 200 Current thread count: 6 Current thread busy: 1 </code></pre> <p>'top' or 'free -m' is similar:</p> <pre><code>Mem: 2097152k total, 1326772k used, 770380k free, 0k buffers 20029 myuser 18 0 805m 240m 11m S 0 11.7 0:19.24 java </code></pre> <p>I tried to start jmap to get a dump of the heap, it also fails with an OutOfMemoryError. Actually as long as one or both of my applications are deployed any other java process fails with the same OOM Error (see top).</p> <p>The problem occurs while the application is deployed. So something is seriously wrong with it. However the application is actually running smoothly for quite a while. But I have seen OOMs in the application as well, so I don't trust the calm.</p> <p>My application is using a custom filter class? Could that be it?</p> <p>For completeness (hopefully), here's the list of libraries in my common/lib:</p> <pre><code>activation-1.1.jar antlr-2.7.6.jar antlr-runtime-3.3.jar asm-3.1.jar asm-commons-3.1.jar asm-tree-3.1.jar c3p0-0.9.1.1.jar commons-collections-3.1.jar commons-email-1.2.jar dependencies-provided.tgz dom4j-1.6.1.jar ejb3-persistence-1.0.2.GA.jar geronimo-annotation_1.0_spec-1.1.1.jar geronimo-jaspic_1.0_spec-1.0.jar geronimo-jta_1.1_spec-1.1.1.jar hibernate-annotations-3.4.0.GA.jar hibernate-commons-annotations-3.1.0.GA.jar hibernate-core-3.3.0.SP1.jar hibernate-entitymanager-3.4.0.GA.jar hibernate-search-3.1.0.GA.jar javassist-3.4.GA.jar joda-time-1.6.2.jar jta-1.1.jar log4j-1.2.16.jar lombok-0.9.3.jar lucene-core-2.4.0.jar mail-1.4.1.jar mysql-connector-java-5.1.14.jar persistence-api-1.0.jar quartz-2.1.1.jar servlet-api-2.5.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar stringtemplate-4.0.2.jar wicket-auth-roles-1.5.1.jar wicket-core-1.5.1.jar wicket-datetime-1.5.1.jar wicket-extensions-1.5.1.jar wicket-request-1.5.1.jar wicket-util-1.5.1.jar xml-apis-1.0.b2.jar </code></pre> <p>I appreciate any hint or even speculation that gives me additional ideas what to try. </p> <p><em>Update</em>: I tested some more and found that this behaviour only occurs while one or both of my applications are deployed. The behaviour does not occur on "empty" tomcat (that was a mistake on my part messing with jvm args)</p> <p><em>Update2</em>: I am currently experimenting trying to reproduce this behaviour in a virtual box, I want to debug this with a profiler. I am still not convinved that it should be impossible to run my setup on 2GB RAM.</p> <p><em>Update3</em> (10/01/12): I am trying to run jenkins instead of my own application. Same behaviour, so it is definitely server configuration issues. Jenkins jobs fail when maven is called, so I need not even try the shutdown hack suggested below because I need a second java process while running Jenkins. It was suggested to me that because this is a Virtual Server ulimits may be imposed from outside and I would not be able to see them. I think I'll ask a new question regarding this. Thx all.</p> <p><em>Update4</em> (02/05/12): see below for the answer that contains the hint. I'll clarify some more up here: I am now 95% sure that the errors occur because I am reaching my thread limit. However because this is a virtual server the method described below would not work to check this value because it is not visible with ulimit, that was what was confusing me and only today I found out that this is the "numproc" value that I can see in the Parallels Power Panel that I can log into for my virtual server. There were Resource Alerts for numproc but I did not see those either until just now. The value has a hard limit of 96 which I cannot change of course. The current value of numproc corresponds to the number of processes I see with "top" after toggling "H" to see threads. I had a very hard time finding this because this numproc value is hidden deep inside the panel. Sadly 96 is a rather low number if you want to run a tomcat with apache and mysql. I am also very sad that I cannot even find this value in the small print of my hosting contract and it is rather relevant to my application I dare say. So I guess I'll need a server upgrade. </p> <p>Thanks all for your helpful answers in the end everyone helped me a bit to find out what the problem was. </p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload