2012-08-16 38 views
3

我有一台运行tomcat7的linux(ubuntu)服务器。服务器有1GB的RAM,并且我正在从java抛出堆空间错误。tomcat java.util.logging进程

基本上发生了什么,是我的Tomcat服务器(运行我的servlet代码)抛出异常,因为没有更多的内存来分配。我的代码非常精简,所以我不认为这是问题。

当我看着HTOP,我看到了很多Java记录过程中,我看到约30这些进程:

ps ax | grep java 
7412 pts/0 Sl  0:02 /usr/bin/java -Djava.util.logging.config.file=/usr/share/tomcat/apache-tomcat-7.0.29/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat/apache-tomcat-7.0.29/endorsed -classpath /usr/share/tomcat/apache-tomcat-7.0.29/bin/bootstrap.jar:/usr/share/tomcat/apache-tomcat-7.0.29/bin/tomcat-juli.jar -Dcatalina.base=/usr/share/tomcat/apache-tomcat-7.0.29 -Dcatalina.home=/usr/share/tomcat/apache-tomcat-7.0.29 -Djava.io.tmpdir=/usr/share/tomcat/apache-tomcat-7.0.29/temp org.apache.catalina.startup.Bootstrap start 
7426 pts/0 D+  0:00 grep --color=auto java 
25937 ?  Sl 13:12 /usr/bin/java -Djava.util.logging.config.file=/usr/share/tomcat/apache-tomcat-7.0.29/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat/apache-tomcat-7.0.29/endorsed -classpath /usr/share/tomcat/apache-tomcat-7.0.29/bin/bootstrap.jar:/usr/share/tomcat/apache-tomcat-7.0.29/bin/tomcat-juli.jar -Dcatalina.base=/usr/share/tomcat/apache-tomcat-7.0.29 -Dcatalina.home=/usr/share/tomcat/apache-tomcat-7.0.29 -Djava.io.tmpdir=/usr/share/tomcat/apache-tomcat-7.0.29/temp org.apache.catalina.startup.Bootstrap start 

这些Java进程缓慢泄漏内存随着时间的推移,因为我只有1GB的与我的tomcat服务器玩ram开始抛出堆空间异常。

我曾与log4j的拨弄(但应关闭),我已经做了所有我可以关闭日志记录在CONFIGS我能找到。

任何帮助将是巨大的,我只需要摆脱这些过程的 - 他们的方式贪婪。谢谢!

〜丹

编辑:更多的信息:

嗨,这可能是一个足够大的提示完全解决这一个 - 我查了一些启动调试以及与此想出了:

Oct 02, 2012 8:50:08 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 

SEVERE: The web application [/NMVServer] appears to have started a thread named [http-bio-8080-exec-53] but has failed to stop it. This is very likely to create a memory leak. 
Oct 02, 2012 8:50:08 AM org.apache.catalina.loader.WebappClassLoader 
clearReferencesThreads 

SEVERE: The web application [/NMVServer] appears to have started a thread named [http-bio-8080-exec-54] but has failed to stop it. This is very likely to create a memory leak. 
Oct 02, 2012 8:50:08 AM org.apache.catalina.loader.WebappClassLoader 
clearReferencesThreads 

SEVERE: The web application [/NMVServer] appears to have started a thread named [http-bio-8080-exec-62] but has failed to stop it. This is very likely to create a memory leak. 
Oct 02, 2012 8:50:08 AM org.apache.catalina.loader.WebappClassLoader 
clearReferencesThreads 

SEVERE: The web application [/NMVServer] appears to have started a thread named [http-bio-8080-exec-64] but has failed to stop it. This is very likely to create a memory leak. 

我发现泄漏的一个问题是由于根据几个论坛的JDBC驱动程序http://bugs.mysql.com/bug.php?id=36565的错误。这解决了我收到的另一个信息。

我一直环顾四周,我发现这是非常有用的:

http://wiki.apache.org/tomcat/MemoryLeakProtection

现在我只是想通过您的所有提醒感谢堆工作!

〜丹

+0

请运行'ps ax | grep java'并粘贴一个* full *命令行。您粘贴的部分只显示一堆配置选项。被称为实际的类是不可见的... – thkala 2012-08-17 11:24:25

+0

对不起,延迟和dodgey的初始职位。我已经用适当的信息更新了它。 – FaddishWorm 2012-08-19 23:03:33

+0

你的意思是你有大约30个进程与你的文章中的pid 7412类似。但是这个过程代表了整个Tomcat服务器,从“org.apache.catalina.startup.Bootstrap start”中可以看出。那意味着你有30台服务器正在运行? – Nikem 2012-10-01 13:00:54

回答

3

我一般我会期待在java中的日志记录代码已经过很好的测试。如果您的日志配置没有生成日志输出,它的开销很低。您的htop结果可能会在tomcat中显示一些空闲的线程状态。

它可以被记录,但你可能要考虑all the ways your application or another component may be leaking memory

所有JVM的有诊断内存泄漏相当不错的工具。像this这样的主题讨论了解发生什么的好方法。

编辑:些心思

您可能要检查会话太多配置,如果大量的请求使用HttpServletRequest.getSession()Manager组件配置进入Context,对于无限制会话,默认值为-1。

的情况下,与the current issue fix list检查您的Tomcat版本,你遇到一个已知的内存泄漏。

最后,Tomcat 7包含一个JreMemoryLeakPreventionListener,可能显示资源未被释放。

+1

谢谢,这给了我一个很好的起点。我知道有几种方法可以愚弄垃圾收集器(可以这么说) - 我已经开始调查我的mysql连接器池并查看其他区域。感谢您的建议。 – FaddishWorm 2012-09-25 00:18:01

+0

P.S.关于servelets和大量使用“doPost”例程有什么特别之处吗? – FaddishWorm 2012-09-25 00:18:58

+0

一般doPost()是无状态的,不应该保持任何连接或创建任何永久对象。重负荷应该不重要。 – pd40 2012-09-25 01:01:10

1

Tomcat通常有一个线程池。 Java EE规范要求启动一个单独的线程来处理每个HTTP请求。 Tomcat有一个线程池,并重用池中的线程,而不是创建和终止它们。更多详情,请here

您可以通过(分别或setenv.bat)修改setenv.sh设置Tomcat的最大内存限制如:可

CATALINA_OPTS='-Xms512m -Xmx1024m' 

更多细节针对Oracle JVM here

但实际上最重要的是跟踪JVM内部的内存分配。您将需要Java VisualVM