Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Unix tomcat java.util.logging进程_Unix_Memory Leaks_Log4j_Tomcat7_Servlet 3.0 - Fatal编程技术网

Unix tomcat java.util.logging进程

Unix tomcat java.util.logging进程,unix,memory-leaks,log4j,tomcat7,servlet-3.0,Unix,Memory Leaks,Log4j,Tomcat7,Servlet 3.0,我有一个运行tomcat7的linux(ubuntu)服务器。服务器有1GB的ram,我收到java抛出的堆空间错误 基本上,我的tomcat服务器(运行我的servlet代码)正在抛出异常,因为没有更多的内存可分配。我的代码非常精简,所以我认为这不是问题所在 当我看htop时,我看到了很多java日志记录过程,我看到了其中的30个过程: ps ax | grep java 7412 pts/0 Sl 0:02 /usr/bin/java -Djava.util.logging.

我有一个运行tomcat7的linux(ubuntu)服务器。服务器有1GB的ram,我收到java抛出的堆空间错误

基本上,我的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的ram可以使用,我的tomcat服务器开始抛出堆空间异常

我已经摆弄了log4j(但它应该被关闭),并且我已经尽我所能关闭了在我能找到的配置中的登录

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

~z~丹

编辑:更多信息:

这可能是一个足够大的提示,足以完全解决这个问题-我检查了一些启动调试,并得出以下结论:

    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驱动程序的一个bug引起的。这解决了我收到的另一个信息

我一直在四处寻找,发现这非常有用:

现在,我只是想通过你的建议,感谢堆工作


~Dan

我一般认为java中的日志代码经过了良好的测试。如果日志配置没有生成日志输出,则开销较低。您的htop结果可能在tomcat中显示一些空闲线程状态

<>它可能是日志记录,但您可能需要考虑。

所有JVM都有很好的诊断内存泄漏的工具。像这样的线程讨论找出发生了什么的好方法

编辑:还有一些想法

如果有很多请求正在使用
HttpServletRequest.getSession()
,则可能需要检查配置中是否存在过多会话。组件配置进入内部,对于无限会话,默认为-1

检查tomcat的版本,以防遇到已知的内存泄漏


最后,Tomcat7包含一个可能显示资源未被释放的代码

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

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

有关Oracle JVM的更多详细信息,请参阅


但实际上,最重要的是跟踪JVM内部的内存分配。您需要执行此操作。

请运行
ps ax | grep java
并粘贴一个完整的命令行。粘贴的部分仅显示一组配置选项。正在调用的实际类不可见…很抱歉延迟和道奇的初始帖子。我已经用适当的信息更新了它。你是说你有大约30个进程,与你帖子中pid 7412的进程相似?但这个过程代表了整个Tomcat服务器,如“org.apache.catalina.startup.Bootstrap start”所示。这意味着你有30台服务器在运行?对不起,这有点含糊不清,我认为这是htop对运行的进程的解释,a{ps ax}更准确。这是JVM的唯一一个引导程序,我想谢谢,这给了我一个很好的起点。我知道有几种方法可以愚弄垃圾收集器(可以这么说)——我已经开始调查我的mysql连接器池,并研究其他方面。谢谢你的建议。关于servlet和大量使用“doPost”例程有什么特别的地方吗?通常doPost()是无状态的,不应该持有任何连接或创建任何永久对象。重负荷应该无关紧要。
CATALINA_OPTS='-Xms512m -Xmx1024m'