我有一个服务器端应用程序为每个连接的客户端打开一个套接字线程。我在每个线程中都有一个DataInputStream,它调用read(byte [] array)来读取数据。我还将套接字超时设置为几分钟。主要代码是这样的:
while (dataInputStream.read(array) != -1) { do something... }
然而,经过几个小时的运行,在带有topthreads插件的jconsole中,我可以看到几个客户端线程各使用20%的ish CPU。如果我单击它,调用堆栈会在read()函数上显示上面一行的线程被阻塞。
我知道read()函数通常会阻塞等待数据。被阻止时,它消耗很少的CPU周期。现在它每个使用20%ish,当更多线程遇到相同问题时,我的服务器运行速度越来越慢。我的服务器每秒大约有5个连接请求,这种情况很少发生,因为在几个小时内只有5个线程出现问题。
我真的很困惑。有人能帮助我吗?
答案 0 :(得分:1)
当jvm等待从套接字读取数据时,系统需要不断进行更多活动。
我没有使用的确切技术,但this link应该给出一些想法..
为什么不尝试使用BufferedInputStream
或任何StreamReader
..这些类会对性能有所帮助。
您可以尝试使用java.util.concurrent包中的类来改进线程处理(创建线程池有助于减少消耗的总内存,从而有助于提高整体系统性能)..不确定您是否正在执行此操作已经
答案 1 :(得分:0)
while (dataInputStream.read(array) != -1) { do something... }
无论如何,这段代码都是错误的。您需要将read()的返回值存储在变量中,以便知道返回了多少字节。如果没有这个,你的应用程序的其余部分可能无法可靠地工作,所以在这个阶段担心时间安排是最不成熟的。
然而,除非数组非常小,否则我怀疑你是否真的在这里使用20%的CPU。更有可能在这里花费了20%的经过时间。阻止网络读取不使用任何CPU。