一、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万多条数据状态下调度是比较健康的。
线程调度中绿色部分表示正常运作的情况
粉色和橙色表示等待和空闲的状态。
从线程调度来看也基本正常。