并发客户端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延迟,也就导致了其它的线程被等待。

扫描二维码关注公众号,回复: 10269200 查看本文章

当清空控制台的数据后,可以发现线程又恢复了一段时间正常。

内存也是

这也说明控制台的信息输出是会影响性能的。

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

在连接200个客户端的情况下,服务端会转发199次,在1.5s内完成,也就是说每秒发生 200*199/1.5 = 26533 大约2万多个连接,内存、cpu虽然有抖动,但是大体上是处于稳定状态。所以说,当前1秒钟发送2万多条数据状态下调度是比较健康的。

线程调度中绿色部分表示正常运作的情况

粉色和橙色表示等待和空闲的状态。

从线程调度来看也基本正常。

发布了174 篇原创文章 · 获赞 115 · 访问量 83万+

猜你喜欢

转载自blog.csdn.net/nicolelili1/article/details/105132976