阿里P8架构师详解Java性能调优策略

一、性能[测试]

Ⅰ.测试方法

  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.面向对象有很多[设计模式],可以用于优化业务层以及中间件层的代码设计,进而达到精简代码和提高整体性能的目的。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

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

Ⅲ. 优化算法

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

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

Ⅳ. 时间换[空间]

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

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

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

Ⅴ. 空间换时间

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

2.例如MySQL的分库分表

Ⅵ. [参数]调优

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

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

四、兜底策略

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

2.[限流]

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

3.[智能]横向扩容

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

4.提前扩容

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

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

五、[总结]

image.png

写在最后

内有技术大咖指点难题,还提供[免费]的Java架构学习资料(里面有[高可用]、高并发、高性能及[分布式]、Jvm性能调优、Spring[源码],MyBatis,[Netty],Redis,Kafka,My[sql],Zookeeper,Tom[cat],Docker,Dubbo,[Nginx]等多个知识点的架构资料)

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

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

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值