ObjectOutputStream 受到打击

maw*_*wia 5 java networking

一个负责在套接字上写入(大量数据,大约 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()
Run Code Online (Sandbox Code Playgroud)

我的直接假设是 ObjectWrite 正在被阻塞。但这种行为充其量是不稳定的。底层网络似乎没问题。在卡住之前,它已经成功写入了几个小时。

在写入下一个块之前,线程还需要至少 50 毫秒的休息时间。那么,如果它不是正常的块,它还能是什么?

堆栈:

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)
Run Code Online (Sandbox Code Playgroud)

mpr*_*vat 3

我怀疑问题是您的服务器读取速度不够快,因此 TCP 发送缓冲区已满。TCP 有算法来帮助它确定何时发送数据包,并且它很大程度上基于当前的传输状态。因此,如果 TCP 堆栈检测到拥塞(因为您正在发送大量数据而服务器没有跟上)。它会减慢/暂停。阅读本文以获取更多信息。

对于到底要修复什么,我没有一个容易的答案,因为您共享的只是堆栈跟踪,但如果我是您,在这种情况下我会查看服务器而不是客户端。

  • +1您可以尝试增加发送缓冲区的大小以消除消费者的延迟。 (2认同)