Java 性能调优实战之概述

发布于:2025-03-27 ⋅ 阅读:(34) ⋅ 点赞:(0)

       Java 性能调优不像是学一门编程语言,无法通过直线式的思维来掌握和应用,它对于工程师的技术广度和深度都有着较高的要求。

        互联网时代,一个简单的系统就囊括了应用程序、数据库、容器、操作系统、网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优化,这就是技术广度;而很多性能问题呢,又隐藏得很深,可能因为一个小小的代码,也可能因为线程池的类型选择错误…可归根结底考验的还是我们对这项技术的了解程度,这就是技术深度。显然,性能调优不是一件容易的事。但有没有什么方法能把这件事情做好呢?

1.扎实的计算机基础

        应用服务的性能可能与操作系统、网络、数据库等组件相关,所以我们需要储备计算机组成原理、操作系统、网络协议以及数据库等基础知识。

2.习惯透过源码了解技术本质

        我们需要深入源码,通过分析来学习、总结一项技术的实现原理和优缺点,这样我们就能更客观地去学习一项技术,还能透过源码来学习牛人的思维方式,收获更好的编码实现方式。

3.善于追问和总结

        很多人在使用一项技术时,只是因为这项技术好用就用了,从来不问自己:为什么这项技术可以提升系统性能?对比其他技术它好在哪儿?实现的原理又是什么呢?事实上,“知其然且知所以然”才是我们积累经验的关键。

概述

如何制定性能调优标准

为什么做性能调优?

什么时候开始调优?

有哪些参考因素可以体现系统的性能?

总结:

        我们知道性能调优可以使系统稳定,用户体验更佳,甚至在比较大的系统中,还能节约资源。但是在项目的开始阶段,我们没有必要过早地介入性能优化,只需在编码的时候保证其优秀、高效,以及良好的程序设计。在完成项目后,我们就可以进行系统测试了,我们可以将以下性能指标,作为性能调优的标准,响应时间、吞吐量、计算机资源分配使用率、负载承受能力。

如何制定性能调优策略

性能测试

1.微基准性能测试:可以精准定位到某个模块或者某个方法的性能问题,特别适合做一个功能模块或者一个方法在不同实现方式下的性能对比。

2.宏基准性能测试:综合测试,需要考虑到测试环境、测试场景和测试目标。

        性能测试存在干扰因子,会使测试结果不准确。所以,我们在做性能测试时,还要注意一些问题。

排查性能问题

1.热身问题:做性能测试时,我们的系统会运行得越来越快,后面的访问速度要比我们第一次访问的速度快上几倍;在刚开始运行的阶段,虚拟机会花费很长的时间来全面优化代码,后面就能以最高性能执行了。

2.性能测试结果不稳定:每次测试处理的数据集都是一样的,但测试结果却有差异。这是因为测试时,伴随着很多不稳定因素,比如机器其他进程的影响、网络波动以及每个阶段 JVM 垃圾回收的不同等等。

3.多 JVM 情况下的影响:一台机器上只部署单独的一个 JVM,在做性能测试时,测试结果很好,但在一台机器多个 JVM 的情况下就不一定了。所以我们应该尽量避免线上环境中一台机器部署多个 JVM 的情况。

制定调优策略

        分析查找问题是一个复杂而又细致的过程,某个性能问题可能是一个原因导致的,也可能是几个原因共同导致的结果。我们分析查找问题可以采用自下而上的方式,而我们解决系统性能问题,则可以采用自上而下的方式逐级优化。

1.优化代码:应用层的问题代码往往会因为耗尽系统资源而暴露出来。往往是将 JVM 中的内存用完了,这个时候系统的内存资源消耗殆尽了。

2.优化设计:有很多设计模式,可以帮助我们优化业务层以及中间件层的代码设计。优化后,不仅可以精简代码,还能提高整体性能。

3.优化算法:好的算法可以帮助我们大大地提升系统性能。

4.时间换空间:有时候系统对查询时的速度并没有很高的要求,反而对存储空间要求苛刻,这个时候我们可以考虑用时间来换取空间。

5.空间换时间:使用存储空间来提升访问速度。现在很多系统都是使用的 MySQL 数据库,较为常见的分表分库是典型的使用空间换时间的案例。

6.参数调优:除了业务层代码的优化,除此之外,JVM、Web 容器以及操作系统的优化也是非常关键的。

兜底测量

        互联网飞速发展的时代,产品的用户量是瞬息万变的,无论我们的系统优化得有多好,还是会存在承受极限,所以为了保证系统的稳定性,我们还需要采用一些兜底策略。

1.限流:对系统的入口设置最大访问限制。同时采取熔断措施,友好地返回没有成功的请求。

2.实现智能化横向扩容:可以保证当访问量超过某一个阈值时,系统可以根据需求自动横向新增服务。

3.提前扩容:这种方法通常应用于高并发系统

总结:

        将性能测试分为微基准性能测试和宏基准性能测试,前者可以精准地调优小单元的业务功能,后者可以结合内外因素,综合模拟线上环境来测试系统性能。两种方法结合,可以更立体地测试系统性能。测试结果可以帮助我们制定性能调优策略,但有一个共同点就是,调优策略千变万化,但思路和核心都是一样的,都是从业务调优到编程调优,再到系统调优。

        但是,任何调优都需要结合场景明确已知问题和性能目标,不能为了调优而调优,以免引入新的 Bug,带来风险和弊端。