一、性能测试

Ⅰ.测试方法

  1. 微基准性能测试
  • 可以精准定位到某个模块或者某个方法的性能问题,例如对比一个方法使用同步实现和非同步实现的性能差异
  1. 宏基准性能测试
  • 宏基准性能测试是一个综合测试,需要考虑到测试环境、测试场景和测试目标
  • 测试环境:模拟线上的真实环境
  • 测试场景:在测试某个接口时,是否有其他业务的接口也在平行运行,进而造成干扰
  • 测试目标
  • 可以通过吞吐量和响应时间来衡量系统是否达标,如果不达标,就需要进行优化
  • 如果达标,就继续加大测试的并发数,探底接口的TPS
  • 除了关注接口的吞吐量和响应时间外,还需要关注CPU、内存和IO的使用率情况

Ⅱ.干扰因素

1.热身问题

①. 在Java编程语言和环境中,.java文件编译成.class文件后,需要通过解析器将字节码转换成本地机器码才能运行

②. 为了节约内存和执行效率,代码在最初被执行时,解析器会率先解析执行这段代码

③. 随着代码被执行的次数增加,当JVM发现某个方法或代码块运行得很频繁时,就会把这些代码认定为热点代码

  • 为了提高热点代码的执行效率,在运行时,JVM将通过即时编译器(JIT)把这些代码编译成与本地平台相关的机器码
  • 并进行各层次的优化,然后存储在内存中,之后每次运行代码时,直接从内存中获取

④. 因此在刚开始运行的阶段,JVM会花费很长的时间来全面优化代码,后面就能以最高性能运行了

2. 测试结果不稳定

①. 不稳定因素:机器其他进程的影响、网络波动、JVM GC的不确定性

①. 解决方案:通过多次测试,将测试结果求平均,只要能保证平均值在一个合理的范围之内,并且波动不大即可

3. 多JVM

①. 任意一个JVM都拥有整个系统的资源使用权

②. 如果一台机器上只部署单独的一个JVM,在做性能测试时,测试结果会很好,但一台机器上有多个JVM,则不一定

③. 尽量避免线程环境一台机器部署多个JVM

二、性能分析

1.完成性能测试之后,需要输出一份性能测试报告,测试结果需要包括

  • 测试接口的吞吐量和响应时间(平均、最大、最小)
  • 服务器的CPU、内存、磁盘IO、网络IO使用率、JVM的GC情况

2.通过观察性能指标,可以发现性能瓶颈,再通过自下而上的方式分析查找问题

  • 首先从操作系统层面,查看系统的CPU、内存、磁盘IO、网络IO的使用率是否存在异常
  • 再通过命令查找异常日志,通过分析日志,寻找导致性能瓶颈的原因
  • 还可以从Java应用的JVM层面下手,查看JVM的GC频率以及内存分配情况是否存在异常
  • 如果系统和JVM层面都没有出现异常情况,可以查看应用服务业务层是否存在性能瓶颈
  • 例如Java编程的问题、读写数据瓶颈

3.分析查找性能问题可以采用自下而上的方式,而解决性能问题,一般采用自上而下的方式逐级优化

三、性能调优

思路业务调优 -> 编程调优 -> 系统调优

Ⅰ. 优化代码

1.应用层的问题代码往往会因为耗尽系统资源而暴露出来

2.例如某段代码导致内存溢出,这往往是将JVM的内存耗尽了

  • 这会引发JVM频繁地发生GC,导致CPU居高不下,此时也会耗尽系统的CPU资源

3.还有一些非问题代码导致的性能问题,比较难以发现

  • 例如如果对LinkedList进行for循环遍历,每次循环获取元素时,都会遍历一次list,读效率很低
  • 优化方案:可以采用Iterator

Ⅱ. 优化设计

1.面向对象有很多设计模式,可以用于优化业务层以及中间件层的代码设计,进而达到精简代码和提高整体性能的目的

2.例如单例模式在频繁创建对象的场景中,可以共享一个对象,减少频繁创建和销毁对象带来的性能开销

Ⅲ. 优化算法

1.合适的算法可以大大提升系统性能

2.例如在不同的场景中,使用合适的查找算法可以降低时间复杂度

Ⅳ. 时间换空间

1.如果系统对查询的速度没有很高的要求,但对存储空间要求苛刻,可以考虑用时间换空间

2.例如String的intern方法,可以将重复率比较高的数据存储在常量池,重复使用相同的对象,大大节省内存空间

  • 但由于常量池使用的是HashMap类型,如果存储数据过多,就会导致查询性能下降

Ⅴ. 空间换时间

1.使用存储空间来提升访问速度

2.例如MySQL的分库分表

Ⅵ. 参数调优

1.根据业务场景,合理地设置JVM的内存空间和GC算法

2.另外,合理地设置Web容器的线程池大小和Linux操作系统的内核参数

四、兜底策略

1.性能优化策略,主要为了提高系统性能,而兜底策略,主要为了确保系统的稳定性

2.限流

  • 对系统的入口设置最大访问限制,参考性能测试中探底的接口TPS
  • 同时采用熔断措施,友好地返回没有成功的请求

3.智能横向扩容

  • 当访问量超过某一个阈值时,系统可以根据需求自动横向扩容

4.提前扩容

  • 常用于高并发系统,例如瞬时抢购
  • 此时智能横向扩容无法满足大量发生在瞬间的请求

5.Kubernetes可以实现智能横向扩容和提前扩容Docker服务

五、总结

写在最后的鸡汤

加油努力吧!比你优秀的对手在学习,你的仇人在磨刀,你的闺蜜在减肥,隔壁老王在练腰, 我们必须不断学习,否则我们将被学习者超越!

趁年轻,使劲拼,给未来的自己一个交代!

更多资料

资料免费获取方式:转发,转发+关注后私信【架构】即可获取资料免费领取方式!

领取资料的朋友就有一些忘记私信而错过宝贵资料,所以关键别忘了转发后私信哦!

这些资料都以整理成了PDF文档,如果有需要获取到这个群里面的文档的话帮忙转发一下然后再关注我私信回复“架构”得到获取方式吧!即可进群获取下载!!!

更多Java架构进阶资料展示

java获取cpu使用率_2019年阿里P8架构师的解析:最新Java性能测试、调优策略相关推荐

  1. 适合专科Java的大厂晋升路线,阿里P8架构师的不传之秘

    最近,有不少朋友留言一些问题,有大三大四学生的,还有一些想转型做Java的: 毕业之后,应该找什么工作? 现在是不是该系统学一些编程之类的,听说薪资很高? 号主您是学Java的吗?是自学的吗?我现在学 ...

  2. 你值得拥有!-阿里P8架构师荣耀典藏:Java多线程与Socket实战微服务框架笔记

    先赞再看,谢谢关注 小编分享的这份<Java多线程与Socket:实战微服务框架>,综合运用Java多线程.Socket.动态代理等技术来构建微服务框架 内容结构 本书从实战角度出发,首先 ...

  3. 一名年薪百万阿里P8架构师写给Java程序员一些建议(架构师必备)

    阿里P8架构师-Peter 毕业于海南大学,曾就职于阿里.苏宁易购等一线互联公司,十余年Java从业经验,系统架构师及微服务之先驱,JEECG急速开发框架的设计与布道者.重点关注微服务设计与编排.高并 ...

  4. 从普通JAVA程序员到阿里P8架构师,他用了六年

    工作年限:8 年服务公司:4 家(含四大门户中的两家)最近职业:Java 架构师职场关键词:社交平台.高并发系统架构设计.技术团队管理.多款从零到一的产品城市! 六年间,这位职人呆过四大门户中的两家, ...

  5. 阿里P8架构师谈:java架构师面试技能24全点

    1,JAVA基础扎实,理解io.多线程.集合等基础框架,对JVM原理有一定的了解,熟悉常见类库,常见java api不仅会用更能知其所以然: 2,对Spring,MyBatis/Hibernate,S ...

  6. 阿里P8架构师谈:多线程、架构、异步消息、Redis等性能优化策略

    常见性能优化策略分类 1.代码 之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视.很多技术人员拿到一个性能优化的需求以后,言必称缓存.异步.JVM等.实际上,第一步就应该是分析相关的代码, ...

  7. 阿里P8架构师谈:流量高峰时期的性能瓶颈有哪些、以及如何来解决

    在高并发大量用户的场景,系统一般会面临如下三个挑战: 1. 日益增长的用户数量 2. 日渐复杂的业务 3. 急剧膨胀的数据 这些挑战对于性能优化而言表现为:在保持和降低系统TP95响应时间(指的是将一 ...

  8. 阿里P8架构师谈(4):流量高峰时期的性能瓶颈有哪些、以及如何来解决

    在高并发大量用户的场景,系统一般会面临如下三个挑战: 日益增长的用户数量 日渐复杂的业务 急剧膨胀的数据 这些挑战对于性能优化而言表现为:在保持和降低系统TP95响应时间(指的是将一段时间内的请求响应 ...

  9. 阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解

    本文涉及的内容以及知识点如下: 1.单体架构 2.单体架构的拆分 3.SOA与微服务的区别 4.微服务的优缺点 5.微服务的消息 6.服务集成 7.数据的去中心化 单体架构 Web应用程序发展的早期, ...

最新文章

  1. 工业用微型计算机(8)-指令系统(5)
  2. 翻译(六)——T-SQL的进阶之路:超过基础的2级水平:写子查询
  3. 华为2017年财报,为何6036亿销售收入,净利润才479亿?
  4. Java线程CAS原子操作
  5. Linux下查看网卡实时流量工具
  6. mysql dsec_MySQL基础(一)查询
  7. 对理想团队模式的构想以及对软件流程的理解
  8. Android自定义ViewGroup、自定义属性及自定义View
  9. thinkphp 按指定字段统计数据条数
  10. 2022跨年代码(有烟花)
  11. 【外文文献检索与下载方法】
  12. mysql 长连接_使用mysql的长连接
  13. android usb键盘监听,android设备外接键盘实现监听事件
  14. python职场应用英语作文_春考关于职场应用的英语作文
  15. 扩展卡尔曼滤波soc估算 基于EKF算法的锂电池SOC 卡尔曼滤波估计电池soc ,simulink模型
  16. 禁止 Windows 10 和 Windows Server 自动更新
  17. 在eclipes中实现支付宝的沙箱模拟付款
  18. 2022全国高职院校教师真实薪酬数据汇总
  19. 论文阅读: Spatial transformer networks
  20. 公式编译器AxMath安装包及在word中使用的教程

热门文章

  1. arduino倾斜开关python语言_Arduino小白的学习记录:倾斜开关实验
  2. 【课题总结】OpenCV 抠图项目实战(6)色彩范围抠图
  3. mysql心得体会一百字_MYSQL CPU 100%实例详解
  4. word2016能识别linux换行符,word文章中的换行符如何批量替换为回车符
  5. python startswitch_使用python esl 实现FreeSWITCH自动外呼
  6. pandas 对某一行标准化_Python中的神器Pandas,但是有人说Pandas慢...
  7. matlab中变.,Matlab变系数微分方程
  8. java容器怎么封装的_docker怎么把容器打包成镜像
  9. Django配置bootstrap
  10. mitmproxy抓包 | Python篡改请求参数实战(五)