java - ObjectOutputStream 被击中

标签 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()

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

线程在写入下一个 block 之前也会休息至少 50 毫秒。 那么,如果它不是普通 block ,它还能是什么?

堆栈:

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)

最佳答案

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

对于具体要解决的问题,我没有现成的答案,因为您共享的只是堆栈跟踪,但如果我是您,在这种情况下我会查看服务器而不是客户端。

关于java - ObjectOutputStream 被击中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15970710/

相关文章:

mysql - 如何使用 ip-tables 将 2 个 ip 地址列入白名单并阻止其他所有内容?

java - 使用大多数 Java 代码制作可执行文件,但可能会添加另一种语言

java - 为什么我不能将 double 隐式转换为 int?

java - 是否可以获取 SortedMap.values() 的列表接口(interface)?

c# - 获取每个连接的带宽统计信息

java - 为什么 future.get() 对于 Volley RequestFuture 总是超时?

Linux gretap - net/ipv4/ip_gre.c - 如何设置 key->tun_flags 的值

java - 为什么我的 JTextFields 没有调整大小?

java - 如何使用 JOOQ 查询生成器构建使用常量值的 Insert into with select 语句

java - 通过发送套接字发送但从未被接收套接字读取的消息会发生什么?