2013-04-12 31 views
3

線程,它負責編寫插座上(數據量龐大,各地4-5MBPS)被卡住,有時長達15分鐘,然後再次來到操作,然後越來越與部分堆棧跟蹤再次陷入爲:的ObjectOutputStream得到擊中

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這種行爲是不穩定的最好的。 基礎網絡似乎沒問題。在卡住之前,它已經成功地寫了幾個小時。

主題也需要至少休息50毫秒寫入下一塊之前。 所以,如果它不是正常的塊,它可能是什麼?

的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) 
+0

你的消費者可以很容易地阻止這種長。例如ObjectInputStream可以創建相當多的垃圾並觸發GC。 –

回答

3

我懷疑問題是您的服務器不讀書足夠快的TCP發送緩衝區填滿。 TCP有算法來幫助它確定何時發送數據包,它主要基於當前的傳輸狀態。所以如果TCP堆棧檢測到擁塞(因爲你發送大量數據而服務器沒有跟上)。它會放慢/暫停。閱讀this瞭解更多信息。

我沒有什麼確切地解決,因爲你共享所有的堆棧跟蹤容易回答,但如果我是你,我會在服務器上看看,而不是在這種情況下客戶端。

+2

+1你可以嘗試增加發送緩衝區的大小,以平滑消費的延遲。 –

+0

這不是'擁堵',那是一個完整的接收窗口。這些是獨立的東西,每個都有自己的窗口。不要混淆他們。你所引用的鏈接犯同樣的錯誤,因此是不可靠的:不要引用時,有規範性公投可用的第三方來源。 – EJP