问题描述
我有一个 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 (将#修改为@)