Java 服务器 - 套接字读取因 CPU 高而冻结

问题描述

我有一个 java 6 服务器,它使用套接字连接其他服务器。
我的服务器使用以下代码从连接的服务器读取数据:

InputStream is = socket.getInputStream();

服务器连接基于TCP连接。
服务器读取字节并按特定格式构建 xml 消息。
服务器一直读取字节,读取部分被while true包围。 连接的服务器一直在发送数据块。

...
Socket socket = new Socket();
socket.setKeepAlive(true);
socket.connect(new InetSocketAddress(hostname,port),timeout);
InputStream is;

int bodyReadBytes = 0;
byte[] msgCap = new byte[BUFF_SIZE]
...
while(true) {
   int bodyLen2Read = msgLen - bodyReadBytes;
   int br = is.read(msgCap,bodyReadBytes,bodyLen2Read); // The problem is here..
   if (br > -1) {
      if (br == bodyLen2Read) {
         // finish reading the message
         createXML(msgCap);
         bodyReadBytes = 0;
         Arrays.fill(msgCap,((byte) 0)); // clean message
      } else {
         // sum the total read until Now
         bodyReadBytes = br + bodyReadBytes;
      }
   }
   ....
}

有时我们会看到命令 is.read(...) 冻结并需要几秒钟而不是立即。我们的应用程序是实时的,因此当发生延迟(即使是 5 秒)时,这很关键。

我们已经检查了消息流中的所有内容,看起来一切正常,问题似乎出在我们的服务器和该特定行中。

出现问题时,vm的cpu达到90%-100%。

虚拟机详情
操作系统:rhel 6.9
cpu:8核
内存:32 RAM
爪哇:1.7.0_80

它可以在半小时内发生几次,也可以在一周内发生一次。 发生后,应用程序就像什么都没发生一样正常运行,没有错误或奇怪的日志。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)