




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第1 1章JavaJava性能调优概述本章对性能优化技术进行整体性的介绍,让读者了解性能的概念和性能优化的基本思 路与方法。掌握这些内容,有助于读者对性能问题进行系统性的分析。本章涉及的主要知识点有:评价性能的主要指标:木桶原理的槪念及其在性能优化中的应用; Amdahl定律的含义;性能调优的层次;系统优化的一般步骤和注意事项。性能概述为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了?也许,你经常 会抱怨这些问题。如果是这样,那说明你的程序出了性能问题。和功能性问题相比,性能 问题在有些情况下,可能并不算什么太大的问题,将就将就,也就过去了。但是,严重的 性能问题会导致程序瘫痪、假
2、死,直至奔溃。本巧就先来认识性能的务种表现和指标。1.1.1看懂程序的性能对客户端程序而言,拙劣的性能会严重影响用户体验。界而停顿、抖动、响应迟钝等 问题会遭到用户不停的抱怨。一个典型的例子就是Eclipse IDE工具在Full GC时会岀现程 序假死现象,相信一左被不少开发人员所诟病。对于服务器程序来说,性能问题则更为重 要,相信不少后台服务器软件都有各自的性能目标。以Web服务器为例,服务器的响应时 间、吞吐疑就是两个重要的性能参数。当服务器承受巨大的访问压力时,可能岀现响应时 间变长、吞吐量下降,甚至是抛出内存溢出异常而朋溃。这些问题,都是性能调优需要解 决的。一般来说,程序的性能通过
3、以下几个方面来表现:执行速度:程序的反映是否迅速,响应时间是否足够短。内存分配:内存分配是否合理,是否过多地消耗内存或者存在泄漏。启动时间:程序从运行到可以正常处理业务需要花费多长时间。负载承受能力:当系统压力上升时,系统的执行速度、响应时间的上升曲线是否 平缓。1.1.2性能的参考指标为了能够科学地进行性能分析,对性能指标进行圧量评测是非常重要的。目前,一些 可以用于定量评测的性能指标有:执行时间:一段代码从开始运行到运行结朿,所使用的时间。 CPU时间:函数或者线程占用CPU的时间。内存分配:程序在运行时占用的内存空间。磁盘吞吐量:描述I/O的使用情况。网络吞吐量:描述网络的使用情况。响应
4、时间:系统对某用户行为或者事件做岀响应的时间。响应时间越短,性能 越好。1.1.3木桶原理与性能瓶颈木桶原理又称“短板理论”,苴核心思想是:一只木桶盛水的多少,并不取决于桶壁 上最髙的那块木块,而是取决于桶壁上最短的那块,如图所示。图木桶原理示意图将这个理论应用到系统性能优化上,可以这么理解,即使系统拥有充足的内存资源和 CPU资源,但是如果磁盘I/O性能低下,那么系统的总体性能是取决于当前最慢的磁盘I/O 速度,而不是当前最优越的CPU或者内存。在这种情况下,如果需要进一步提升系统性能, 优化内存或者CPU资源是亳无用处的。只有提髙磁盘I/O性能才能对系统的整体性能进行 优化。而此时,磁盘I
5、/O就是系统的性能瓶颈。Q注意:根据木桶原理,系统的最终性能取决于系统中性能表现最差的组件。因此,为了 提升系统整体性能,必须对系统中表现最差的组件逬行优化,而不是对系统中表 现良好的组件进行优化。SpeeduSpeedup p 根据应用的特点不同,任何计算机资源都有可能成为系统瓶颈。其中,最有可能成为 系统瓶颈的计算资源如下。磁盘I/O:由于磁盘I/O读写的速度要比内存慢很多,程序在运行过程中,如果需 要等待磁盘I/O完成,那么低效的I/O操作会拖累整个系统。网络操作:对网络数据进行读写的情况与磁盘I/O类似。由于网络环境的不确左性, 尤苴是对互联网上数据的读写,网络操作的速度可能比本地磁盘
6、I/O更慢。因此, 如不加特殊处理,也极可能成为系统瓶颈。 CPU:对计算资源要求较高的应用,由于其长时间、不间断地大疑占用CPU资源, 那么对CPU的争夺将导致性能问题。如科学计算、3D渲染等对CPU需求旺盛的 应用。异常:对Java应用来说,异常的捕获和处理是非常消耗资源的。如果程序高频率 地进行异常处理,则整体性能便会有明显下降。数据库:大部分应用程序都离不开数据库,而海量数据的读写操作可能是相当费 时的。而应用程序可能需要等待数据库操作完成或者返回请求的结果集,那么缓 慢的同步操作将成为系统瓶颈。锁竞争:对高并发程序来说,如果存在激烈的锁竞争,无疑是对性能极大的打击。 锁竞争将会明显增
7、加线程上下文切换的开销。而且,这些开销都是与应用需求无 关的系统开销,白白占用宝贵的CPU资源,却不带来任何好处。内存:一般来说,只要应用程序设计合理,内存在读写速度上不太可能成为性能 瓶颈。除非应用程序进行了高频率的内存交换和扫描,但这些情况比较少见。使 内存制约系统性能的最可能的情况是内存大小不足。与磁盘相比,内存的大小似 乎小的可怜,这意味着应用软件只能尽可能将常用的核心数据读入内存,这在一 建程度上降低了系统性能。1.1.4 Amdahl 定律Amdahl泄律是计算机科学中非常重要的左律,它上义了串行系统并行化后加速比的汁 算公式和理论上限。加速比定义:加速比二优化前系统耗时/优化后系
8、统耗时所谓加速比,就是优化前的耗时与优化后耗时的比值。加速比越髙,表明优化效果越 明显。Amdahl泄律给出了加速比与系统并行度和处理器数量的关系。设加速比为Speedup,Speedup, 系统内必须串行化的程序比重为F,CPU处理器数量为N,则有:根据这个公式,如果CPU处理器数量趋于无穷,那么加速比与系统的串行化率成反比, 如果系统中必须有50%的代码串行执行,那么系统的最大加速比为2。假设有一程序分为以下步骤执行,每个执行步骤花费100个时间单位。其中,只有步 骤2和步骤5可以进行并行,步骤1、3、4必须串行,如图所示。在全串行的情况下,系 1统合计耗时500个时间单位。100100
9、-100-100 - 100100 100100 100100步骤I I步骤2 2 步骤3 3 步骤4 4 步骤5 5图串行工作流程若将步骤2和步骤5并行化,假设在双核处理上,则有如图所示的处理流程。在这种 情况下,步骤2和步骤5的耗时将为50个是单位。故系统整体耗时为400个时间单位。根 据加速比的定义有:加速比二优化前系统耗时/优化后系统耗时=500/400=500/400=或者前文中给出的加速比公式。由于5个步骤中,3个步骤必须串行,因此英串行化 比重为3/5=,即民,且双核处理器的处理器个数N为2。代入公式得:加速比=1/+/2)=1/+/2)=图 双核处理上的并行化在极端情况下,假设
10、并行处理器个数为无穷大,则有如图所示的处理过程。步骤2和 步骤5的处理时间趋于0。即使这样,系统整体耗时依然大于300个时间单位。即加速比 的极限为500/300=.| wo |一q |彳 ig |_ too 1 |步骤1 1| | | 步骤3 3步骤4 4| | |步骤2 2步骤5 5图极端情况下的并行化使用加速比计算公式,N趋于无穷大,有SpeedupMF.SpeedupMF.且厲,故有Speech.Speech.由此可见,为了提高系统的速度,仅增加CPU处理器的数量并不一左能起到有效的作 用,需要从根本上修改程序的串行行为,提髙系统内可并行化的模块比重,在此基础上, 合理增加并行处理器数
11、量,才能以最小的投入,得到最大的加速比。A注意:根据Amdahl定律,使用多核CPU对系统进行优化,优化的效果取决于CPU的 数呈以及系统中的串行化程序的比重。CPU数星越多,串行化比重越低,则优化 效果越好。仅提高CPU数星而不降低程序的串行化比重,也无法提高系统性能。性能调优的层次为了提升系统性能,开发人员可以从系统的各个角度和层次对系统进行优化。除了最 常见的代码优化外,在软件架构上、JVM虚拟机层、数据库以及操作系统层面都可以通过 各种手段进行调优,从而在整体上提升系统的性能。1.2.1设计调优设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行。在软件开发之 初,软件架构师就
12、应该评估系统可能存在的务种潜在问题,并给出合理的设讣方案。由于 软件设计和架构对软件整体质量有决立性的影响,所以,设计调优对系统性能的影响也是 最大的。如果说,代码优化、JVM优化都是对系统微观层而上“量”的优化,那么设汁优 化就是对系统在宏观层而上“质”的优化。设计优化的一大显著特点是,它可以规避某一个组件的性能问题,而非改良该组件的 实现。比如,系统中组件A需要等待某事件E才能触发一个行为。如果组件A通过循环 监控不断监测事件E是否发生,其监测行为必然会占用部分系统资源,因此,开发人员必 须在监测频率和资源消耗间取得平衡。如果监测频率太低,虽然减少了资源消耗,但是系 统实时反应性就会降低。
13、如果进行代码层的调优,就需要优化监测方法的实现以及求得一 个最为恰当的监测频率。而若将此问题预留在设计层解决,便可以使用事件通知的方式将系统行为进行倒置。如 使用第2章中提到的观察者模式,在事件E发生的时刻,由事件E通知组件A,从而触发组 件A的行为。这种设计方法弃用了存在性能隐患的循环监控,从根本上解决了这一问题。从某种程度上说,设计优化直接决立了系统的整体品质。如果在设计层考虑不周,留 下太多问题隐患,那么这些“质”上的问题,也许无法再通过代码层的优化进行弥补。因 此,开发人员必须在软件设计之初,认真仔细考虑软件系统的性能问题。进行设计优化时,设计人员必须熟悉常用的软件设计方法、设讣模式、
14、基本性能组件 和常用优化思想,并将其有机地集成在软件系统中。Q注意:一个良好的系统设计可以规避很多潜在的性能问题。因此,尽可能多花些时间在 系统设计上,是创建高性能程序的关键。1.2.2代码调优代码调优是在软件开发过程中,或者在软件开发完成后,软件维护过程中进行的对程 序代码的改进和优化。代码优化涉及诸多编码技巧,需要开发人员熟悉相关语言的API, 并在合适的场景中正确使用相关API或类库。同时,对算法、数据结构的灵活使用,也是 代码优化的重要内容。虽然代码优化是从微观上对性能进行调整,但是一个“好”的实现和一个“坏”的实 现对系统的影响也是非常大的。比如,同样作为List的实现,Linked
15、List和ArrayList在随 机访问上的性能却可以相差几个数疑级:又如,同样是文件读写的实现,使用Stream方式 与Java NIO的方式,其性能可能又会相差一个数量级。因此,虽然与设计优化相比,笔者将代码优化称为在微观层而上的优化,但是它却是 对系统性能产生最直接影响的优化方法。1.2.3 JVM 调优由于Java软件总是运行在JVM虚拟机之上,对JVM虚拟机进行优化也能在一左程度 上提升Java程序的性能。JVM调优通常可以在软件开发后期进行,如在软件开发完成, 或者在软件开发的某一里程碑阶段。作为Java软件的运行平台,JVM的各项参数将会直接影响Java程序的性能。比如, JVM
16、的堆大小、垃圾回收策略等。要进行JVM层而的调优,需要开发人员对JVM的运行原理和基本内存结构有一立了 解如,堆内存的结构、GC的种类等。然后,依据应用程序的特点,设置合理的JVM启 动参数。1.2.4数据库调优对绝大部分应用系统而言,数据库是必不可少的一部分。Java程序可以使用JDBC的 方式连接数据库。对数据库的调优可以分为3个部分:在应用层对SQL语句进行优化:对数据库进行优化:对数据库软件进行优化。在应用层优化数据库访问,涉及大量的编程技巧。比如,当使用JDBC进行查询时, 对于大量的拥有相同结构的SQL查询,可以使用PreparcdStatement代替Statement,以提 高
17、数据库的査询效率;在Select语句中,显示指左要查询的列名,避免使用星号在对数据库进行优化时,主要目的是建立一个具有良好表结构的数据库。比如,为了 提高多表级联査询效率,可以合理地使用冗余字段:对于大表,可以使用行的水平切割或 者类似Oracle分区表的技术;为了提高数据库査询效率,可以建立有效且合理的索引。对于数据库软件的优化,根据不同的数据库,如Oracle. MySQL或者SQL Server都 拥有不同的方式。以Oracle为例,设置合理大小的共享池、缓存缓冲区或者PGA,对Oracle 的运行性能都有很大的影响。鉴于本书的讨论范围,数据库优化将不作为本书的阐述重点。1.2.5操作系
18、统调优作为软件运行的基础平台,操作系统的性能对应用系统也有较大的影响。不同类型的 操作系统,调优的手段和参数可能会有所不同。比如,在主流UNIX系统中,共享内存段、 信号量、共享内存最大值(shmmax)、共享内存最小值(shmmin)等都是可以进行优化 的系统资源。此外,如最大文件句柄数、虚拟内存大小、磁盘的块大小等参数都可能对软 件的性能产生影响。图展示了在Windows平台上,配置虚拟内存的界而。图WindowsWindows下设宜熄拟内存Q说明:操作系统的性能调优不在本书的讨论范围内,有兴趣的读者可以参考相关书籍。基本调优策略和手段存在性能问题的系统,十之八九是由某一系统瓶颈导致的。只
19、要找到该性能瓶颈,分 析瓶颈的形成原因,对症下药,使用合理的方法解决系统瓶颈,就能从根本上提升性能。 所以,系统性能优化的最主要目的就是查找并解决性能瓶颈问题。但同时值得注意的是, 性能优化往往会涉及对原有的实现进行较大的修改,因此,很难保证这些修改不引入新的 问题。所以,在性能优化前,需要对性能优化的目标、方法进行统筹的安排。更新硬件1.3.1优化的一般步骤对软件系统进行优化,首先需要有明确的性能目标,淸楚地指出优化的对象和最终目 的。其次,需要在目标平台上对软件进行测试,通过各种性能监控和统汁工具,观测和确 认当前系统是否已经达到相关目标,若已经达到,则没有必要再进行优化;若当前系统性 能
20、尚未达到优化目标,则需要查找当前的性能瓶颈。可能成为性能瓶颈的因素有很多,比如:磁盘I/O、网络I/O和CPU。当找到性能瓶 颈后,首先需要泄位相关代码,确认是否在软件实现上存在问题或者优化空间。若有,则 进行代码优化:若已经没有代码优化空间,则需要考虑进行JVM层、数据库层或者操作系 统的优化。甚至,可以考虑修改原有设计,或者提升硬件性能。当优化完成后,需要在目标平台上进行确认测试。若达到性能目标,则优化过程结束: 若没有,则需要再次查找系统瓶颈,以此反复,如图所示。修改代码优化箕法, 对JVM.JVM.操作系统或数 据库调优,改良设计,1.3.2系统优化注意事项软件的性能优化虽然能提升软件的性能,但是优化过程往往伴随着一些风险和弊端。 比如,为了优化某一段代码的实现,就需要重写原有的算法,而这就很可能引入新的Bug。 重新实现新的功能模块也同时意味着需要重新对其进行完整的功能性测试,使优化前所做 的测试工作变得亳无意义。而且,优化后的代码与优化前的代码相比,可能会比较晦涩难 懂,从一圧程度上影响了系统的可维护性。因此,软件优化需要在软件功能、正确性和可 维护性间取
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 遂宁市中石油2025秋招笔试英语专练题库及答案
- 宣城市中石油2025秋招笔试英语专练题库及答案
- 铜川市中石油2025秋招笔试模拟题含答案炼油工艺技术岗
- 2025年近期江苏考试试题及答案
- 中国移动阜阳市2025秋招笔试行测题库及答案技能类
- 大唐电力秦皇岛市2025秋招面试专业追问及参考综合管理岗位
- 神农架林区中石油2025秋招面试半结构化模拟题及答案安全环保与HSE岗
- 2025年液压培训考试题及答案
- 2025年单色理论考试题及答案
- 中国移动永州市2025秋招财务审计类专业追问清单及参考回答
- 2025年中国眼视光行业发展深度分析与未来前景研究报告
- 出入境化妆品抽、采样作业指导书
- 中秋国庆双节活动主题
- 创新方法大赛理论知识考核试题题库及答案
- 中考英语高频词汇大纲表(人教版)
- 血透患者跌倒的预防及管理
- 砼回弹强度自动计算表
- 医防融合知识讲座
- 培养幼儿的语言能力
- 《认识几种常见的岩石》说课稿、教案和教学设计
- 广东省监理从业人员网络继续教育平台题库
评论
0/150
提交评论