负责在套接字上写入(大量数据,大约4-5MBPS)的线程被卡住了,有时长达15分钟,然后再次执行操作,然后再次被卡住,部分堆栈跟踪如下:
java.lang.Thread.State: RUNNABLE
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.write(Unknown Source)
- locked <0xa4ca4660> (a java.io.BufferedOutputStream)
mypackage.myMethod()我的直接假设是ObjectWrite正在获取block.But,这种行为充其量是不稳定的。底层网络看起来没问题。在被卡住之前,它已经成功地写了几个小时。
在写入下一个块之前,线程也需要至少50ms的休息时间。因此,如果它不是普通的块,它还可能是什么呢?
pstack:
ff2cba60 send (10, 4dc230, c312, 0)
fe03ce58 Java_java_net_SocketOutputStream_socketWrite0 (3a4928, c312, 10, 95f7f890, 0, c312) + 158
fc093e5c * java/lang/System.getSecurityManager()Ljava/lang/SecurityManager;+3
fc08ec3c * *java/net/SocketOutputStream.socketWrite([BII)V [compiled] +45
fc08ec3c * *java/net/SocketOutputStream.write([BII)V+5
fc005ab0 * java/io/BufferedOutputStream.write([BII)V+20
fc005ab0 * mypackage.mymethod()V+84 (line 598)发布于 2013-04-12 19:59:58
我怀疑问题是你的服务器读得不够快,所以TCP发送缓冲区被填满了。TCP有一些算法可以帮助它确定何时发送数据包,它主要基于传输的当前状态。因此,如果TCP堆栈检测到拥塞(因为您正在发送大量数据,而服务器没有跟上)。它会减慢/暂停。有关更多信息,请阅读this。
我没有现成的答案来解决这个问题,因为您共享的都是堆栈跟踪,但如果我是您,在这种情况下,我会查看服务器而不是客户端。
https://stackoverflow.com/questions/15970710
复制相似问题