Java Tomcat 6.0应用程序中的内存泄漏

Java Tomcat 6.0应用程序中的内存泄漏,java,sockets,tomcat,tcp,Java,Sockets,Tomcat,Tcp,我正在使用套接字应用程序。我有一个JAVA TCP侦听器作为web应用程序的一部分。我已经将我的TCP侦听器定义为web.xml中的servlet上下文侦听器,所以一旦启动tomcat,我的TCP侦听器就会变为活动状态,并等待来自GPS设备的传入请求 一旦我的tomcat6.0启动,TCP侦听器就能够读取所有传入的请求,但是,就在5分钟后,我收到了这样一个错误:“web应用程序似乎启动了一个名为的线程,但未能停止它。这很可能会造成内存泄漏。” 请帮我解决这个问题。因为我同时创建了许多线程来处理传

我正在使用套接字应用程序。我有一个JAVA TCP侦听器作为web应用程序的一部分。我已经将我的TCP侦听器定义为web.xml中的servlet上下文侦听器,所以一旦启动tomcat,我的TCP侦听器就会变为活动状态,并等待来自GPS设备的传入请求

一旦我的tomcat6.0启动,TCP侦听器就能够读取所有传入的请求,但是,就在5分钟后,我收到了这样一个错误:“web应用程序似乎启动了一个名为的线程,但未能停止它。这很可能会造成内存泄漏。”

请帮我解决这个问题。因为我同时创建了许多线程来处理传入的请求,因为我们有10K GPS设备与我的TCP侦听器通信。 我们有商业理由为单个设备创建一个线程并处理传入的请求

请帮我弄清楚实际的问题

提前谢谢

The web application appears to have started a thread named but has failed to stop it.
请帮我解决这个问题

好吧,也许停止那条线?看起来您的错误消息不完整,它通常有一个线程名称(或者您的线程有空(
“”
)名称

Tomcat中的这个错误并不严重,但您应该调查它出现的原因,看看:尤其是哪个线程是目标线程


为了停止线程签出:。

我假设您已经检查了启动Tomcat的JVM设置。可能是内存太少

我建议您下载VisualVM1.3.3,安装所有插件,启动Tomcat应用程序,并将VisualVM连接到JVM。它将向您展示内存、CPU、创建的对象、线程等方面的情况

您没有显示代码,也没有数据。您永远无法通过这种方式解决此问题。这里也没有人能为您提供太多帮助。您的代码正在创建太多对象。您需要找出原因并停止它

我们有商业理由为单个设备创建单个线程 并处理传入的请求

您可能有业务原因,但您的技术原因可能不合理。每个HTTP请求都有一个线程。这不是您想要的吗?当GPS发布请求时,您有一个线程来处理它,对吗?为什么必须为每个请求创建多个线程?这些线程在做什么

另一种方法可能是避免创建线程。当来自设备的请求传入时,找到一些唯一的标记,如设备id,并将该消息添加到该设备的会话历史记录中。到目前为止,我还没有听到创建线程的任何理由


我不知道您是否费心编写自己的服务器,但我建议您考虑使用Netty。这是一个基于非阻塞IO的全Java服务器,天生就可以处理高流量。他们知道如何处理线程。也许您可以使用它并将处理逻辑添加到其中。

亲爱的Irfy,请帮助我,我不知道from我必须去哪里并接受答案,我没有找到链接,请您帮助我。感谢Dear Tomasz,我收到了这样一个错误:“web应用程序似乎启动了一个名为[thread-1302]的线程,但未能停止它。”正如我告诉你的,我需要为每个设备创建单独的线程。因此,我有超过10K个线程在运行。请帮助我解决问题。thanks@user405575:线程总数无关紧要。错误显示:您已启动一个线程,请停止它(中断它)在关闭应用程序之前。我不知道您是如何创建这些线程的,但您必须优雅地关闭它们。亲爱的Tomasz,我无法停止线程,我希望保持活动状态,因为一旦与GPS设备建立连接,设备将继续在同一线程上发送数据。这就是我拥有所有10K活动线程的原因。请用另一种方式暗示我。thanks@user405575我不是告诉您在应用程序运行时停止这些线程。我是说您应该在应用程序取消部署/关闭时停止它们。此错误仅在关闭/重新部署期间出现在Tomcat中。我从未看到它在应用程序运行时弹出。您确定没有出现吗重新部署或者应用程序没有悄无声息地消亡?不,Tomsz,我的tomcat在启动时从未到达,因为我已经将我的TCP侦听器编写为servlet上下文侦听器,它在我的tomcat启动后运行,一旦我的TCP启动,它将等待传入的请求,而我的代码则在其中写入(true)亲爱的duffymo,GPS设备通过互联网与我们的TCP侦听器通信,并且它在所有请求中都包含数据包,服务提供商对互联网使用收费很高,因此每个设备都有单独的线程,因此不需要花费太多时间来反复创建与设备的连接将我的perm gen更改为1 GB,可以吗?如果你继续快速地使用资源和内存,它将不起作用。可能只需要20分钟就可以关闭,而不是5分钟。你的实现存在严重缺陷。我会重新考虑它。我可以使用sleep方法使线程睡眠,这样它就不会使用更多资源和我与线程wi的连接吗i’我也很好。事实上,我不想在我的设备连接后失去与它的连接,因为设备每分钟都在发送数据,我不能每分钟创建一个线程并停止线程,请建议我。thanksI建议你找一个知道如何编写服务器和多线程代码的人来帮你完成。如果你必须在这里问一下,你不应该这样做。当然,你意识到Tomcat是一个servlet/JSP引擎,HTTP servlet是HTTP侦听器。那些GPS设备向你的侦听器发出HTTP GET/POST请求吗?你一直在说TCP。