网站建设个人实训报告巨量数据官网
之前接触过一些高并发场景下的性能优化,最近过年时候又碰巧看了一些相关资料,趁着还没忘干净,手动整理一下,有一些是在别处看到的,有一些是自己的亲身经历,因为偏向于自己整理笔记所以很多地方都只是列了一个大纲和解决办法,并没有详细涉及原理,感兴趣的朋友可以自行查阅相关文献
1.确认瓶颈:
cpu,内存,磁盘,网络,异常,数据库,锁竞争
cpu:代码递归导致的无限循环,正则表达式引起的回溯,JVM 频繁的 FULL GC,以及多线程编程造成的大量上下文切换
内存:内存溢出、内存泄露
异常:如果在高并发的情况下引发异常,持续地进行异常处理,那么系统的性能就会明显地受到影响。
锁竞争:Java 为了降低锁竞争带来的上下文切换,对 JVM 内部锁已经做了多次优化,例如,新增了偏向锁、自旋锁、轻量级锁、锁粗化、锁消除等
2.优化代码:
1)我们经常使用的 LinkedList 集合,如果使用 for 循环遍历该容器,将大大降低读的效率,但这种效率的降低很难导致系统性能参数异常。这时有经验的同学,就会改用 Iterator (迭代器)迭代循环该集合,这是因为 LinkedList是链表实现的,如果使用 for 循环获取元素,在每次循环获取元素时,都会去遍历一次List,这样会降低读的效率。
2)字符串优化:String 对象的拼接涉及到线程安全,你可以使用 StringBuffer。但是要注意,由于 StringBuffer 是线程安全的,涉及到锁竞争,所以从性能上来说,要比StringBuilder 差一些。
3)在每次赋值的时候使用 String 的 intern 方法,如果常量池中有相同值,就会重复使用该对象,返回对象引用,这样一开始的对象就可以被回收掉。这种方式可以使重复性非常高的地址信息存储大小从 20G 降到几百兆。
4)我们应该慎重使用 Split() 方法,我们可以用 String.indexOf() 方法代替 Split() 方法完成字符串的分割。如果实在无法满足需求,你就在使用 Split() 方法时,对回溯问题加以重视就可以了。
5)慎重使用正则表达式,对于正则表达式的优化方式有:1.少用贪婪模式,多用独占模式 2. 减少分支选择 3. 减少捕获嵌套
6)Stream提高遍历集合效率::在循环迭代次数较少的情况下,常规的迭代方式性能反
而更好;在单核 CPU 服务器配置环境中,也是常规迭代方式更有优势;而在大数据循环迭
代中,如果服务器是多核 CPU 的情况下,Stream 的并行迭代优势明显。所以我们在平时
处理大数据的集合时,应该尽量考虑将应用部署在多核 CPU 环境下,并且使用 Stream 的
并行迭代方式进行处理。
7)我们在编码中也可以优化 HashMap 的性能,例如,重新 key 值的 hashCode() 方法,降
低哈希冲突,从而减少链表的产生,高效利用哈希表,达到提高性能的效果。
8)I/O瓶颈:BIO,NIO,AIO
9)避免java序列化
10)RPC 通信是重点优化的对象
11)select,poll,epoll
以上写的比较简单,是一些常用的优化手段,还有很多暂时没有补充完整,留一个坑,后续会慢慢补充