Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat关机时内存不足_Java_Tomcat_Memory Leaks_Wicket - Fatal编程技术网

Java 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)

简要描述我的问题:我使用部署的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)
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