【发布时间】:2011-08-19 19:13:13
【问题描述】:
我有一个 Web 应用程序,在后端部署了 Servlet 并通过 tomcat 部署。该应用程序是简单的 java 应用程序。
我在服务器日志中经常看到此错误: 严重:Web 应用程序似乎启动了一个名为 [22] 但未能阻止它。这很有可能 造成内存泄漏。
是否有任何可能导致它的潜在原因?
【问题讨论】:
标签: java multithreading servlets
我有一个 Web 应用程序,在后端部署了 Servlet 并通过 tomcat 部署。该应用程序是简单的 java 应用程序。
我在服务器日志中经常看到此错误: 严重:Web 应用程序似乎启动了一个名为 [22] 但未能阻止它。这很有可能 造成内存泄漏。
是否有任何可能导致它的潜在原因?
【问题讨论】:
标签: java multithreading servlets
我会使用visualvm 1.3.2 并查看正在创建哪些线程。请务必添加所有插件。
如果不是由您的代码完成,您将无法对其进行太多控制。
您也不知道该消息是否是红鲱鱼。在一段时间内对您的代码进行负载测试并衡量会发生什么。
【讨论】:
我最近遇到了类似的情况,通过以下步骤解决
- 我进行了线程转储。 (使用 Kill -QUIT pid)
- 找到 Runnable/Thread 类表单转储
- 然后我在运行方法中放置了一个调试点并启动了应用程序 调试模式。
- 得到了启动我的线程的代码,我观察到它不是 在停止应用程序时停止。
- 在 contextDestroyed 方法中引入了停止线程的代码 AppContextListener(这是我的应用程序类,它扩展 ServletContextListener ),因为当我停止时将调用此方法 Tomcat。
如果你把 Thread 设置为 Dameon Thread 没有帮助,你可以访问explanation。
【讨论】:
Tomcat 等待所有应用程序的线程(用户线程而不是守护线程)在它关闭之前停止,我猜在你的情况下,这个特定的线程是一个用户线程,因此 tomcat 产生了这个错误。 我建议你把这个线程改成 daemon(假设这个是你的)
【讨论】: