2012-11-17 35 views
1

我在apache 2.2上运行tomcat 7 & mod_jk 1.2.26在2GB内存的debian-lenny x64服​​务器上。
我的服务器出现了一个奇怪的问题:每隔几分钟,每隔几小时&(负载下),我的tomcat ajp连接器会因内存泄漏错误而暂停,但似乎这个错误也会影响系统的其他部分(例如一些其他正在运行的应用程序也停止工作)&我必须重新启动服务器以解决问题一段时间。
我检查catalina.out中了好几天,但它只是这个消息暂停AJP似乎之前的没有一个唯一的错误模式:与apache,tomcat和mod_jk和mysql的内存泄漏

Exception in thread "ajp-bio-8009-Acceptor-0" java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:597)... 
:暂停前

INFO: Pausing ProtocolHandler ["ajp-bio-8009"] 

有时,此消息

&有时这一个:

INFO: Reloading Context with name [] has started 
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:597) 
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5482) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:230) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3847) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:424) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1214) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1400) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1410) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1410) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1389) 
    at java.lang.Thread.run(Thread.java:619) 
java.sql.SQLException: null, message from server: "Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug"... 

&一些其他时候outpu t消息与程序的其他部分有关。
我检查了我的应用程序源代码&我不认为它会导致问题,我还使用jConsole检查了内存使用情况。令人满意的一点是,当服务器失败时,在堆堆&非堆栈jvm内存空间上显示大量可用内存。正如我之前告诉的,在服务器崩溃后,许多其他应用程序在我想重新启动它们时也会失败&它会提供资源暂时不可用的消息(我也检查了我的limits.conf文件)。
所以我真的很困惑这个严重的问题很多天&我真的没有更多的想法。所以,任何人都可以给我任何建议,以解决这个复杂的&未知的问题?
这个错误最可能的原因是什么?

+0

也许你可以看看serverfault.com – Sietse

回答

0

我终于找到了问题:它实际上并不是内存泄漏,但VPS允许线程数量的限制导致了问题。我的服务器是Xen vps,默认限制为256个线程,所以当它达到允许的最大线程数时,管理员会杀死一些正在运行的线程(这是导致我停止运行某些进程的原因)。通过将允许的线程数量增加到512,问题完全解决了(当然,如果我在tomcat设置中增加maxThreads,则显然问题会再次上升)。

0

您对流程数量有何限制?

使用uname -a检查它们并检查最大进程数。如果是1024,请增加它。

此外,请检查您正在使用的用户启动它的相同的事情(例如,如果您使用的是没有用户的东西,请运行su -c“ulimit -a”-s/bin/sh nobody to看看这个用户看到的是什么限制)。这应该会给你带来一个问题(前两天,完全错过了检查)。

在开始发生的那一刻,您还可以使用“ps -eLf | wc -l”来计算该用户的所有正在运行的线程和进程(或者甚至更好地使用rrdtool或其他方法监视它),这将会让您回到您的系统上运行的所有进程和线程的简单计数。这些信息以及所有特定用户的限制都可以解决您的问题。

0

使用jvisualvm检查您的jvm的堆使用情况。如果你看到它在一段时间内缓慢攀升,那就是内存泄漏。有时候内存泄漏是短期的,最终会被清除,只能重新开始。

如果您看到锯齿图案,请在锯齿峰顶附近堆放堆积物,否则在jvm运行足够长时间后需要堆积堆积物,并且存在OOM错误的高风险。然后将该.hprof文件复制到另一台计算机上,并使用Eclipse MAT(内存分析工具)将其打开并识别可能的罪魁祸首。你仍然需要花费一些时间在数据结构的refs之后,并且阅读一些Javadocs来找出正在使用的Hashmap或List是什么在失去控制。分类选项对于关注最可能出现的问题区域也很有用。

有没有简单的答案。

请注意,SUN jvm中还包含一个命令行工具,可以触发heapdump。如果你有一个好的分析器也可以使用,因为内存泄漏通常在一段经常执行的代码中,因此会在分析器中显示为热点。