1

我有一个服务器端应用程序为每个连接的客户端打开一个套接字线程。我在每个线程中有一个 DataInputStream,它调用 read(byte[]array) 来读取数据。我还将套接字超时设置为几分钟。主要代码是这样的:

while (dataInputStream.read(array) != -1) { do something... }

但是,运行几个小时后,在带有 topthreads 插件的 jconsole 中,我可以看到几个客户端线程每个都使用 20%ish CPU。如果我点击它,调用堆栈显示线程在上面的行中被阻塞,在 read() 函数上。

我知道 read() 函数通常会阻塞以等待数据。阻塞时,它消耗很少的 CPU 周期。现在它每个都使用 20%ish,当更多线程遇到相同问题时,我的服务器运行速度越来越慢。我的服务器每秒大约有 5 个连接请求,这种情况很少发生,因为在几个小时内只有 5 个线程有问题。

我真的很困惑。有人能帮我吗?

4

2 回答 2

1

当 jvm 等待从套接字读取数据时,系统需要不断执行更多的活动..

我没有使用的确切技术,但这个链接应该给出一些想法..

您为什么不尝试使用 aBufferedInputStream或任何StreamReaders .. 这些类将有助于提高性能。

您可以尝试使用 java.util.concurrent 包中的类来改进线程处理(创建线程池将有助于减少消耗的总内存,从而有助于提高整体系统性能)..不确定您是否已经这样做了

于 2011-07-30T20:17:06.407 回答
0
while (dataInputStream.read(array) != -1) { do something... }

无论如何,这段代码都是错误的。您需要将 read() 的返回值存储在一个变量中,以便知道返回了多少字节。无论如何,如果没有这个,你的应用程序的其余部分就不可能可靠地工作,所以在这个阶段担心时间还为时过早。

但是,除非阵列非常小,否则我怀疑您是否真的在这里使用了 20% 的 CPU。更有可能 20% 的已用时间都花在了这里。阻止网络读取不使用任何 CPU。

于 2011-07-31T06:02:51.137 回答