我正在使用套接字应用程序。我有一个JAVA TCP侦听器作为Web应用程序的一部分。我已将我的TCP侦听器定义为web.xml中的servlet上下文侦听器,因此一旦启动我的tomcat,我的TCP侦听器就会变为活动状态并等待来自GPS设备的传入请求。
一旦我的tomcat6.0启动,那么TCP侦听器就能够读取所有传入的请求,但是,在5分钟之后,我收到类似这样的错误“Web应用程序似乎已经启动了一个名为但未能阻止它的线程。这很可能会造成内存泄漏。“。
请帮我解决此问题。因为我正在同时创建许多线程来处理传入请求,因为我们有10K GPS设备与我的TCP侦听器通信。 我们有业务原因为单个设备创建单个线程并处理传入请求。
请帮我弄清楚实际问题。
提前致谢。
答案 0 :(得分:2)
The web application appears to have started a thread named but has failed to stop it.
请帮我解决这个问题。
好吧,也许停止那个帖子?看起来您的错误消息不完整,它通常有一个线程名称(或者您的线程可能有空(""
)名称?
Tomcat中的此错误并不重要,但您应该调查它出现的原因,请查看:Is this very likely to create a memory leak in Tomcat?,尤其是Tomcat 6 memory leaks log entries定位线程。
为了停止线程检出:How to stop a thread that is running forever without any use。
答案 1 :(得分:0)
我假设您已经检查了启动Tomcat的JVM设置。也许你的记忆太低了。
我建议您下载Visual VM 1.3.3,安装所有插件,启动Tomcat应用程序,并将Visual VM连接到JVM。它将向您展示在内存,CPU,创建的对象,线程等方面发生的事情。
您没有显示任何代码,也没有数据。你永远不会以这种方式解决这个问题。这里没有人可以帮助你。您的代码创建了太多对象。你需要找出原因并阻止它。
我们有商业理由为单个设备创建单个线程 并处理传入的请求。
您可能有商业原因,但您的技术原因可能不合理。进来的每个HTTP请求都有一个线程。这不是你想要的吗?当GPS发布请求时,您有一个线程来处理它,对吗?为什么必须为每个请求创建多个线程?那些线程在做什么?
另一种方法可能是避免创建线程。当请求来自设备时,请找到一些唯一标记,例如设备ID,并将该消息添加到该设备的会话历史记录中。到目前为止,我还没有听到任何创建线程的理由。
我不知道你是否在编写自己的服务器时遇到了麻烦,但我建议你考虑使用Netty。它是一个基于非阻塞IO的全Java服务器,它可以用来处理高流量。他们知道如何处理线程。也许你可以使用它并将处理逻辑添加到它。