当前位置: 首页 > news >正文

高并发场景下机器性能优化sop

之前接触过一些高并发场景下的性能优化,最近过年时候又碰巧看了一些相关资料,趁着还没忘干净,手动整理一下,有一些是在别处看到的,有一些是自己的亲身经历,因为偏向于自己整理笔记所以很多地方都只是列了一个大纲和解决办法,并没有详细涉及原理,感兴趣的朋友可以自行查阅相关文献

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

以上写的比较简单,是一些常用的优化手段,还有很多暂时没有补充完整,留一个坑,后续会慢慢补充

http://www.lryc.cn/news/19784.html

相关文章:

  • 【女程序员进大厂面试经验】
  • 计算机网络笔记(复试准备)第一章
  • WooCommerce 上传文件 Vanquish v71.6
  • zabbix4.0 Web页面配置 - 聚合图形的实现
  • 计算机网络 — UDP协议(看这一篇就可以
  • Pikachu靶场(暴力破解)
  • 浅谈script,link,import,@import引入
  • 【CSS】CSS 层叠样式表 ① ( 简介 | CSS 引入方式 - 内联样式 | 内联样式语法 | 内联样式缺点 )
  • 12.STM32系统定时器-SysTick
  • 28张图讲解支付系统的通用设计,漂亮!
  • 【5】linux命令每日分享——touch创建文件
  • TypeScript快速上手语法+结合vue3用法
  • 一,下载iPerf3最新源代码
  • keithley6487/吉时利6487皮安表
  • sql命令大全
  • Ubuntu 定时执行脚本
  • Python带你制作一个属于自己的多功能音乐播放器
  • Redis 被问麻了...
  • 使用JavaScript+Selenium玩转Web应用自动化测试
  • [架构之路-119]-《软考-系统架构设计师》-计算机体系结构 -1- 基本原理(体系结构、指令系统与流水线、层次存储)
  • 【离线数仓-8-数据仓库开发DWD层-交易域相关事实表】
  • 你知道Java架构师学习路线该怎么走吗?你所缺少的是学习方法以及完整规划!
  • 华为OD机试用Python实现 -【查找树中的元素 or 查找二叉树节点】(2023-Q1 新题)
  • MyBatis——创建与使用
  • 【涨薪技术】0到1学会性能测试 —— 参数化关联
  • go进阶(2) -深入理解Channel实现原理
  • 数组(二)-- LeetCode[303][304] 区域和检索 - 数组不可变
  • 22-基于分时电价条件下家庭能量管理策略研究MATLAB程序
  • “XXX.app 已损坏,打不开。您应该将它移到废纸篓”,Mac应用程序无法打开或文件损坏的处理方法(2)
  • flask入门-3.Flask操作数据库