Java Tomcat关机时内存不足
简要描述我的问题:我使用部署的Wicket应用程序启动Tomcat。当我想关闭tomcat时,会收到以下错误消息:Java Tomcat关机时内存不足,java,tomcat,memory-leaks,wicket,Java,Tomcat,Memory Leaks,Wicket,简要描述我的问题:我使用部署的Wicket应用程序启动Tomcat。当我想关闭tomcat时,会收到以下错误消息: 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)
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.<clinit>(Reference.java:145)
“top”或“free-m”类似:
Mem: 2097152k total, 1326772k used, 770380k free, 0k buffers
20029 myuser 18 0 805m 240m 11m S 0 11.7 0:19.24 java
我试图启动jmap以获取堆的转储,但也失败了,出现了OutOfMemoryError。实际上,只要部署了我的一个或两个应用程序,任何其他java进程都会以相同的OOM错误失败(见上图)
部署应用程序时会出现问题。所以它有严重的问题。然而,应用程序实际上在相当长的一段时间内运行平稳。但我在应用程序中也看到OOM,所以我不相信它的冷静
我的应用程序正在使用自定义筛选器类?是吗
为完整起见(希望如此),以下是我的common/lib中的库列表:
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
我很感激任何暗示,甚至猜测,给我更多的想法,尝试
更新:我又测试了一些,发现这种行为只在部署一个或两个应用程序时发生。这种行为不会发生在“空”tomcat上(这是我搞乱jvm参数的一个错误)
更新2:我目前正在尝试在一个虚拟盒子中重现这种行为,我想用一个分析器来调试它。我仍然不相信在2GB内存上运行我的设置是不可能的
更新3(10/01/12):我正在尝试运行jenkins而不是我自己的应用程序。同样的行为,所以肯定是服务器配置问题。调用maven时Jenkins jobs失败,因此我甚至不需要尝试下面建议的关闭hack,因为在运行Jenkins时,我需要第二个java进程。有人向我建议,因为这是一个虚拟服务器,ulimit可能是从外部强加的,我将无法看到它们。我想我会问一个新问题。谢谢
更新4(2012年5月2日):有关包含提示的答案,请参见下文。我将在这里进一步澄清:我现在95%确定错误发生是因为我达到了线程限制。然而,由于这是一个虚拟服务器,下面描述的方法无法检查此值,因为它在ulimit中不可见,这让我感到困惑,直到今天我才发现,这是我可以在Parallels电源面板中看到的“numproc”值,我可以为我的虚拟服务器登录。有numproc的资源警报,但我也没有看到,直到刚才。这个值有一个96的硬限制,当然我不能改变。numproc的当前值对应于我在切换“H”以查看线程后看到的进程数,该进程数为“top”。我很难找到这个,因为这个numproc值隐藏在面板的深处。遗憾的是,如果您想使用apache和mysql运行tomcat,96是一个相当低的数字。我也很难过,我甚至无法在我的托管合同的小字中找到这个价值,我敢说,这与我的应用程序相当相关。所以我想我需要升级服务器
谢谢大家的帮助,最后每个人都帮了我一点,找出了问题所在 你可能会像这样活一段时间。您所需要做的就是在需要重新启动tomcat进程时终止它。这不是一个好方法,但主要的问题是应用程序运行是否正确
但在我看来,从长远来看,您可能需要订购一个具有更多可用RAM的托管计划。就在上周,我在安装tomcat时遇到了类似的问题。我通过给tomcat一个较小的堆来修复它。大概是这样的:
export CATALINA_OPTS=”-Xms256m -Xmx512m”
在开始之前,Tomcat可能会有所帮助。与此同时,你必须用老式的方式杀死它,使用kill-9
;)
编辑:您也可以看看,tomcat似乎自动创建了一组“空闲”线程,但您可以在配置中限制这些线程以及最大线程数。希望有帮助。看来您打开的线程太多了 使用此命令:
ulimit -u
结果如何?
应该是这样的:
max user processes (-u) 100
如果这是正确的,您可以编辑此文件:
/etc/security/limits.conf
以及以下修改:
#<domain> <type> <item> <value>
user soft nproc 10000
user hard nproc 10000
#
用户软件nproc 10000
用户硬nproc 10000
tomcat关机过程包括通过tcp端口向运行中的tomcat VM发送命令/字。这个端口是在server.xml中配置的(如果我没有记错的话,我现在正在手机上写)。到目前为止还不错
不幸的是,关闭脚本通过启动2来实现这一点。VM使用与tomcat相同的java选项。您的系统没有足够的内存进行此操作
作为解决方案,您可以使用telnet或其他方式编写自己的停止脚本
如果需要的话,我以后可以帮忙
希望有帮助。
Viele grüsse Bert如果在终端运行tomcat时运行
free-m
,会发生什么?另外,您有任何特殊的catalina_选项吗?jetty all服务器对我来说似乎很奇怪。所有其他依赖项似乎都很好,但为什么要在Tomcat中嵌入jetty(可能是Wicket需要的,我不知道Wicket)。啊,感谢jetty在测试中给出的提示。我应该删除它。也许您可以使用-XX:-HeapDumpOnOutOfMemoryError选项获得JVM的堆转储:谢谢。ulimit-u向我提供了用户进程不受限制的信息,这可能是另一个提示:add-Xss128kI永不停止学习。但遗憾的是,这并没有提供解决办法。Tomcat经理告诉我,运行的线程很少。谢谢,我终于找到了正确的答案。它不是很完美,因为ulimit-u没有告诉我这一点。我不得不进入parallels面板,发现我的线程限制是96,我在tomcat、apache、mysql上很快就使用了这个限制……有趣的是,现在的行为有点不同了。我将对此进行更多的实验。很高兴能提供帮助,如果是这样的话,看看我刚刚发布的编辑,也许你的问题是默认的“备用”
#<domain> <type> <item> <value>
user soft nproc 10000
user hard nproc 10000