2012-03-18 37 views
-1

朋友,许多线程连接制作系统不稳定

我正在构建一个JAVA TCP侦听器,它可以在一个时间处理6000个传入请求。我创建一个套接字连接和接受数据,接受数据后,我通过创建一个线程做了一些操作,但我没有杀死这个线程,因为设备将在每两分钟发送一次数据,所以我只是在制作线程进入睡眠模式30秒。

但运行系统五分钟后,我的应用程序在tomcat6.0下运行时出现错误 - “Web应用程序似乎已经启动了一个名为[Thread-214]的线程,但未能阻止它。可能会造成内存泄漏。“

请帮助我理解我在哪里做错了吗?

在此先感谢。

+0

[Tomcat中6.0应用程序内存泄漏]的可能重复(http://stackoverflow.com/questions/9753120/memory-leak-in-tomcat-6-0-application) – duffymo 2012-03-18 14:45:48

+1

Tomcat是一个servlet容器,并用于自行处理请求和线程。你以错误的方式使用它。你试图达到的目标应该在一个独立的应用程序中完成。正如在另一个问题中所评论的那样,您只保留线程,以便用户可以回来并使用相同的线程。取而代之的是,使用一些内存中的缓存或持久性。你的整体设计是有缺陷的。 – Sean 2012-03-18 15:16:36

+0

发布您用于创建和启动线程的代码。 – Java42 2012-03-18 15:18:09

回答

2

如果你有很多插座,而是采用每通道线。 尝试使用一个遍历所有套接字的线程。 看看Java的选择 http://www.exampledepot.com/egs/java.nio/NbClient.html

+0

你能解释一下这个链接对我有用吗? – geekIndiana 2012-03-18 15:09:41

+0

在您的情况下,您需要处理大多数时间处于空闲状态的多个套接字。如果你给每个插座,你会很快耗尽内存。选择器给你一个迭代器,它在无限循环中接收要执行动作的套接字上的事件(每2分钟发送一次数据)。你可以读取数据并采取相应的行动。 – Horonchik 2012-03-18 19:33:23

1

你应该知道,你的操作系统无法处理这么多线程。而且,内存分配给每个线程,所以你会很快填满你的堆。

正如我不知道你想实现什么,我只是猜测,你有你的应用程序中的设计缺陷,通常线程重用,以处理请求。

+0

+1 - “我只是猜测你的应用程序中有一个设计缺陷,通常线程被重用来处理请求。”这是绝对正确的。 – duffymo 2012-03-18 15:12:34

+0

@Remi,我知道基本规则,我知道线程可重用性的优点,但正如我在我的场景中所讨论的,我不想失去与车辆和车辆在场中运行的GPS设备的连接,所以丢失连接并重新建立连接是困难的。因此,我正在创建一个单独的线程来建立连接并始终保持活动状态,并使用相同的线程读取数据。告诉我我错在哪里?谢谢 – geekIndiana 2012-03-18 15:36:15

+0

我不明白为什么有必要为每个连接创建一个线程,难道你没有一个处理连接列表的心跳线程?正如肖恩所说,你确定你需要Tomcat吗? – 2012-03-18 17:21:45

0

我认为选择可能会有帮助。你可能想在这个环节上阅读有关选择一个简短的介绍http://tutorials.jenkov.com/java-nio/selectors.html “选择是一个Java NIO组件,它可以检查一个或多个NIO频道的,并确定哪些渠道准备好如阅读或写作。这样,一个线程可以管理多个通道,从而管理多个网络连接。“

0

如果您需要处理与Java许多TCP连接 - 你应该使用NIO。但编程裸NIO(选择器)很难 - 所以使用Netty,它是专门为这些任务而设计的。 Netty在Tomcat内部工作正常。