java - Catalina.out 内存泄漏错误

标签 java tomcat catalina.out

我仍然在 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/

相关文章:

java - Spring Tomcat : Non-whitespace characters are not allowed in schema elements . 锯 '301 Moved Permanently'

amazon-web-services - ALB健康检查问题

tomcat8 - 无法消除 catalina.out 中的 Tomcat 缓存警告

java - 没有catalina.out

tomcat - 每天使用 catalina.sh 记录 catalina.out 的轮换

java - 检查是否授予 FOREGROUND_SERVICE 权限总是返回 false

java - 使用 hibernate 注释预先加载持久对象

java - spring-boot 3.0.0 GraaVM 用于接口(interface) jakarta.servlet.http.HttpServletRequest

java - Spring Boot应用程序错误

java - 在哪里可以找到 Mac OS 的 jni 头文件