Java ObjectOutputStream被击中

Java ObjectOutputStream被击中,java,networking,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.SocketOu

负责在套接字(海量数据,约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()

我怀疑问题在于您的服务器读取速度不够快,因此TCP发送缓冲区已满。TCP有算法来帮助它判断何时发送数据包,它主要基于传输的当前状态。因此,如果TCP堆栈检测到拥塞(因为您正在发送大量数据,而服务器无法跟上)。它会慢下来/停下来。阅读更多信息


我没有一个确切的答案来解决什么问题,因为你共享的只是一个堆栈跟踪,但如果我是你,在这种情况下,我会关注服务器而不是客户端。

+1你可以尝试增加发送缓冲区的大小,以消除消费者的延迟。这不是“拥塞”,这是一个完整的接收窗口。这些是独立的东西,每个都有自己的窗口。别把他们弄糊涂了。你引用的链接也犯了同样的错误,因此不可靠:当有规范性的公投可用时,不要引用第三方来源。你的消费者很容易阻止这么长时间。例如,ObjectInputStream可以创建大量垃圾并触发GC。
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)