一、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萬多條數據狀態下調度是比較健康的。
線程調度中綠色部分表示正常運作的情況
粉色和橙色表示等待和空閒的狀態。
從線程調度來看也基本正常。