现网问题排查小记
排查过程
在测试环境,有一个服务的消费速度非常慢。
希望提高消费者的线程数,来消费提高性能,但发现没有起到作用,本地测试了一下,发现有一哥方法占用cpu时间非常高
涉及的具体的代码如下:
这边首先怀疑是不是replaceAll() 正则替换引起的,测试机的cpu在70%左右经过测试,将该方法的逻辑删除,返回改成固定的静态值,消费速度确实大幅提高。
经过高人指点,决定使用火焰图进行性能分析,查看比较慢的方法:
YoungGC频繁 10次/s
找到了对应的方法 readXML(),做了响应优化(左边是优化前的)
主要原因还是读取的XML文件比较大,在读取的过程,产生了大量String对象,引起了频繁的Young GC, 从而影响了吞吐。
优化后吞吐明显提升:
YongGC 下降明显
加线程无法提高效率的原因也找到了,String每次会创建多个对象,每个线程在消费的时候,都会去读取文件,这样如果增加消费线程,那么创建的String对象也多了,young gc 的频率也提升了(要花更多的cpu时间来做gc),所以导致加线程也无法提高吞吐。
总结
在操作大文本时,一定要使用StringBuffer
提问
下图中,用红色方框圈起来的方法表示什么含义