我仍然在 tomcat/logs/catalina.out
中看到这个错误。
Dec 29, 2011 4:04:36 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/LoggingMonitor] appears to have started a thread named [Timer-1] but has failed to stop it. This is very likely to create a memory leak.
Dec 29, 2011 4:04:36 PM org.apache.coyote.http11.Http11Protocol destroy
INFO: Stopping Coyote HTTP/1.1 on http-8180
是否值得考虑?如果值得,我该如何纠正?
最佳答案
这可能没什么大不了的(只需 kill -9 或其他东西)并且很容易修复。只需找出哪个 webapp 在/LoggingMonitor 的上下文中运行,然后 grep 其代码库...
new Timer();
...并将它们全部替换为...
new Timer( true );
java.util.Timer 默认情况下不在守护线程中运行。您的 webapps 中的任何计时器都需要在守护线程上运行(否则容器无法正常关闭,因为它正在等待计时器线程结束,而它永远不会这样做)。找到所有“new Timer()”调用并将它们替换为“new Timer(true)”,日志记录投诉应该会停止。
花一些时间在 JavaDocs 上学习一些关于守护线程与非守护线程的知识:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html
当我在 webapps 中工作时,如果我最终要进行任何我自己的多线程处理,我总是使用守护线程。使用 java.util.concurrent 中的工具,这变得非常罕见(必须做我自己的线程处理)。
最后,郑重声明,我讨厌 java.util.Timer,并且总是建议使用 ScheduledExecutor 之类的东西来执行周期性的重复性任务。在 Timer 中搞砸并取出它执行的 Tread 太容易了,守护进程或其他。
关于java - Catalina.out 内存泄漏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8677008/