第1章 Java性能调优概述

1.1 性能概述

1.1.1 看懂程序的性能

什么是Full GC? Full GC是指发生在Java堆老年代的GC,会发生Stop The World程序假死现象。

以WEB服务器为例,服务器的响应时间,吞吐量就是两个重要的性能参数。当服务器承受巨大的访问压力时,可能出现响应时间变长,吞吐量下降,甚至是抛出内存溢出异常而崩溃。

一般来说,程序的性能通过以下几个方面来表现:
执行速度:程序的反应是否迅速,响应时间是否够短;
内存分配:内存分配是否合理,是否过多地消耗内存或者存在泄漏;
启动时间:程序从运行到可以正常处理业务需要花费多长时间;
负载承受能力:当系统压力上升时,系统的执行速度,响应时间的上升曲线是否平缓;

1.1.2 性能的参考指标

目前,一些可用于定量评测的性能指标有:
执行时间:一段代码从开始运行到运行结束,所消耗时间;
CPU时间:函数或多线程占用CPU的时间;
内存分配:程序在运行时占用的内存空间;
磁盘吞吐量:描述IO的使用情况;
网络吞吐量:描述网络的使用情况;
响应时间:系统对某用户行为或者事件做出响应的时间,时间越短,性能越好;

1.1.3 木桶原理与性能瓶颈

最有可能成为系统瓶颈的资源如下:
磁盘IO:磁盘IO读写速度要比内存慢很多,程序在运行过程中,如果需要等待磁盘IO完成,那么低效的IO将会拖累整个系统;
网络IO:与磁盘IO读写情况类似,由于网络环境的不确定性高,可能会比磁盘IO更慢;
CPU:对计算资源要求较高的应用,可能会成为瓶颈;
异常:对Java应用来说,异常的捕获和处理是非常消耗资源的;
数据库:海量数据的读写操作可能是相当费时的,而应用程序可能需要等待数据库操作来完成或者返回请求的结果集,那么缓慢的同步操作将成为系统瓶颈;
锁竞争:对高并发程序来说,如果存在激励的锁竞争,无疑是对性能极大的打击。锁竞争将会明显增加线程上下文切换的开销,白白占用宝贵的CPU资源;
内存:使内存制约系统性能的最可能的情况是内存不足导致;

1.1.4 Amdahl定律

为了提高系统的速度,仅增加CPU处理器的数量并不一定能起到有效的作用,需要从根本上修成程序的串行化行为,提高系统内可并行化的比重,在此基础上,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比。

根据Amdahl定律,使用多核CPU对系统进行优化,优化的效果取决于CPU的数量以及系统中的串行化程序的比重。CPU数量越多,串行化比重越低,则优化效果越好。仅提高CPU数量而不降低程序的串行化比重,也无法提高系统性能。

1.2 性能调优的层次

1.2.1 设计调优

设计调优处于所有调优手段的上层,由于软件设计和架构对软件整体质量有决定性的影响,所以,设计调优对系统性能的影响也是最大的。如果说,代码优化,JVM优化都是对系统微观层面上“量”的优化,那么设计优化就是对系统在宏观层面上“质”的优化。

设计调优的一大显著特点,它可以规避某一组件的性能问题,而非改良该组件的实现。

1.2.2 代码调优

代码优化涉及诸多编码技巧,需要开发人员熟悉相关语言的API,并在合适的场景中正确使用相关API或类库。同时,对算法,数据结构的灵活使用,也是代码优化的重要内容。
代码优化称为在微观层面上的优化,但是它却是对系统性能产生最直接影响的优化方法。

1.2.3 JVM调优

作为Java软件的运行平台,JVM的各项参数将会直接影响到Java程序的性能。比如:JVM堆大小,垃圾回收策略等

1.2.4 数据库调优

数据库调优分为3个部分:

  1. 在应用层对SQL语句进行优化,如:在Select语句中,避免使用星号“*”,显示指定要查询的例名。等等;
  2. 对数据库进行优化,如:(1)设计良好的表结构(2)合理使用冗余字段(3)使用分区/分表策略(4)合理且有效的索引。等等;
  3. 对数据库软件进行优化,以Oracle为例,如:设置合理大小的共享池,缓存缓冲区或者PGA。等等;

1.2.5 操作系统调优

1.3 基本调优策略和手段

1.3.1 优化的一般步骤

  1. 首先,需要明确性能指标,清楚地指出优化的对象和最终目的;
  2. 其次,需要在目标平台上对软件进行测试,通过各种性能监控和统计工具,查找当前的性能瓶颈;
  3. 定位性能瓶颈的相关代码,进行代码优化;
  4. 若已经没有代码优化空间,则需要考虑JVM层,数据库层或者操作系统层的优化;
  5. 甚至,可以修改原有设计,或者提升硬件性能;

1.3.2 系统优化注意事项

在进行软件优化时,必须进行慎重的评估。性能调优必须有明确的目标。不要为了调优而调优,如果当前程序并没有明显的性能问题,盲目的进行调整,其风险可能远远大于收益。

你可能感兴趣的:(第1章 Java性能调优概述)