Stay Hungry Stay Foolish

Java项目性能优化简介

Posted on By Jun Xi Gu

本文是对Java项目性能优化的基本知识的汇总和个人理解


性能问题的现状

传统的项目开发过程:分析->设计->编码->测试,缺少对性能问题的考虑,导致开发出来的系统很可能不符合性能的需求

应该在分析的阶段就提炼出性能的需求,以用例的形式表达处理,在设计阶段加以考虑潜在的新能问题,并在测试阶段之前增加性能测试用例和分析来弥补,所以最终的开发流程是:
分析->设计->编码->性能测试->测试

性能分析的两种方法

通过从不同的方向来寻找可优化的空间

  • 自顶向下:从应用层->容器->虚拟机->… 来寻找可优化的空间,通过监控应用,容器,操作系统的性能数据找出问题所在,执行某些措施来优化性能
  • 自底向上:从CPU->操作系统->.. 通过监控底层的信息来发现不同架构中应用的性能差异,对环境根据性能分析数据来调优;例如一定负载下CPU的指令数,高速缓存未命中率等,通过某些措施(如使用JIT编译器优化机器码)来改善硬件和操作系统的性能

很多时候,CPU的架构会对应用的性能起到关键的影响,所以需要恰当的选择,例如多核和每核多硬件线程比多CPU更适合需要大量线程的应用,因为当CPU就绪,而某个硬件线程所需的资源未就绪时,可以在下一个时钟周期内切换到同CPU中的另一个硬件线程,而单硬件线程的CPU切换线程需要耗费数百个时钟周期;
另一方面,多硬件线程的CPU的时钟频率比较慢,所以当应用所需的线程不多时,单硬件线程的CPU的性能要比多硬件线程的CPU要好

改善性能的3种活动

  • 性能监控:以非浸入式的方式收集和查看应用的性能数据
  • 性能分析:以浸入式的方式收集运行性能数据,会对应用的延迟和吞吐率产生影响,集中于被报告的性能问题
  • 性能调优:通过更改运行配置参数,代码等多种方式来改善应用的性能,一般在性能监控和性能分析后进行

参考文献

《Java性能优化权威指南》