阿里P8架构师:详解Java效能调优策略
一、效能测试
Ⅰ.测试方法
微基准效能测试可以精准定位到某个模组或者某个方法的效能问题,例如对比一个方法使用同步实现和异步实现的效能差异宏基准效能测试宏基准效能测试是一个综合测试,需要考虑到测试环境、测试场景和测试目标测试环境:模拟线上的真实环境测试场景:在测试某个界面时,是否有其他业务的界面也在平行执行,进而造成干扰测试目标可以通过吞吐量和响应时间来衡量系统是否达标,如果不达标,就需要进行优化如果达标,就继续加大测试的并发数,探底界面的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服务
五、总结
需要的Java架构师方面的资料可以关注之后私信哈,回复“资料”领取免费架构视讯资料,记得要点赞转发噢!!!