一、性能概述
公司投入人力物力成本开发出的程序,如果出现程序瘫痪、界面停顿、抖动、响应迟缓等问题,会大大降低用户体验,损失大量用户。对于上述问题,都是需要性能调优来解决的问题。
程序性能主要表现在代码的执行速度、软件系统的内存分配是否合理、代码的启动加载时间是否够长、软件系统的负载承受能力是否足够等方面。
常见的系统瓶颈如下:
- 磁盘I/O:磁盘io读写速度远小于内存读写,低效的磁盘io会拖垮整个系统。
- 网络传输:代码需要对互联网上的数据进行读写,由于网络环境的不确定性,网络读写的速度较慢也会成为系统性能瓶颈。
- CPU资源抢占:系统中存在科学计算、3d渲染等对cpu资源长期占用的操作,也会造成其他操作cpu资源抢占时的性能问题。
- 异常捕获:异常捕获和处理较为消耗资源,程序中过多捕获异常也会造成性能问题
- 数据库操作:大部分系统需要数据库读写查询,如果数据读写耗时较长也会拖死整个系统。
- 高并发场景下的锁竞争:在高并发场景下,为了防止并发问题时常需要加锁,在锁资源抢占时,会造成系统的性能问题。
- 系统内存的分配:内存和磁盘的比例要合理,内存过小也会成为系统读写的瓶颈。
二、性能调优的层次
1.设计调优
设计调优处于软件开发之前,需要我们在技术选型之前,都要考虑到采用相关技术可能遇到的技术瓶颈,熟悉常用的软件射界方法、设计模式、基本组件的性能和常见的优化思想,给出合理的解决设计方案。
2.代码调优
代码调优发生在软件编码过程中,需要开发者熟悉Java语言的API,并在正确的工作场景中使用API或类库。同时也要求开发者对算法和数据结构的灵活应用,编写出高效复用性高的代码。
3.java虚拟机调优
Java软件都是运行在Java虚拟机之上的,通过调节Java虚拟机参数大大提升Java程序运行的效率。
4.数据库调优
Java语言通过jdbc方式进行数据库连接,因此对数据库的优化可以分为以下三个方面:
- 在应用层对SQL语句进行优化
常见的SQL语句优化就是为未添加索引的字段添加索引,已添加索引的字段是否索引失效,是否使用select * 进行了全表扫描。
- 对数据库进行优化 在设计数据库表时,是否进行了库表字段冗余设计,多表联查时提高查询效率对于大表进行分表
- 对数据库软件进行优化
熟悉常见的数据库软件,选用合适的数据库,来提高数据库连接的效率
三、性能调优的策略和手段
3.1 性能优化的一般步骤
- 确立性能调优目标和明确最终调优目标
- 使用分析软件对现行系统进行性能监控、统计、观测,确定现行软件是否达到性能目标。若达到,无需优化,
- 没有达到,寻找现行系统瓶颈,进行性能优化
- 优化完成在目标平台上重新测试,确定是否达到既定性能目标,没有的话重复上述操作直至达到目标
3.2 性能优化注意事项
- 性能优化后的代码,可能新的bug,因此优化后的代码需要复测
- 优化后后的代码可能晦涩难懂,降低了代码可读性,不利于维护。