併發客戶端BUG修復與性能優化二

一、bufferedReader讀取數據

如果強制退出,讀取數據時可能爲空,使用str時可能報空指針異常

str = bufferedReader.readLine()

所以需要添加判斷

  if(str == null||Foo.COMMAND_EXIT.equalsIgnoreCase(str)){
                break;
            }

 

二、

內存不斷上升

cpu時間消耗統計

時間消耗最多的是write、readLine以及println。

這兩個主要是IO輸出,即System.out或者System.in的IO輸出。這兩個是界面端的消耗,這兩個東西包括了控制檯信息輸出以及從控制檯讀取數據的輸入。之所以從控制檯讀取數據排到前面,是因爲其在主線程當中,而給主線程分配的cpu時間稍微多一些。但對於整個性能的影響來說,輸出的影響更大一些,因爲輸出的字符串到屏幕上並不能被回收,即GC並不能GC掉屏幕上的信息,從而導致GC延遲,也就導致了其它的線程被等待。

當清空控制檯的數據後,可以發現線程又恢復了一段時間正常。

內存也是

這也說明控制檯的信息輸出是會影響性能的。

所以,去掉下面代碼中的System.out

 

在連接200個客戶端的情況下,服務端會轉發199次,在1.5s內完成,也就是說每秒發生 200*199/1.5 = 26533 大約2萬多個連接,內存、cpu雖然有抖動,但是大體上是處於穩定狀態。所以說,當前1秒鐘發送2萬多條數據狀態下調度是比較健康的。

線程調度中綠色部分表示正常運作的情況

粉色和橙色表示等待和空閒的狀態。

從線程調度來看也基本正常。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章