1.1 性能是什么
在性能调优之前,我们首先来了解一下性能是什么?关于性能,我想每个学习过Java的人都能列出几点,甚至可以夸夸其谈。在《Java TM Platform Performance》一书中,定义了如下五个方面来作为评判性能的标准:
1) 运算的性能——哪一个算法的执行性能最好?
2) 内存的分配——程序运行时需要耗费多少内存?
3) 启动的时间——程序启动需要多长时间?这在Web项目中的影响不大,但要注意部分程序需要部署或运行在客户端时的情形(比如applet程序)。
4) 程序的可伸缩性——在压力负载的情况下,程序的性能如何?
5) 性能的感知——用户在什么情况下会觉得程序的性能不好?
以上五个方面,在具体的使用场景可以有选择的去评判。至于这五方面的性能调优,在后续的章节中将会陆续的给以相应的性能调优策略。
1.2 调优的规则
我们只需要关心对我们程序有影响,可以察觉到的性能问题,而不是每一个类中的每一个方法我们都需要想方设法的提高性能。如果程序的性能没有达到我们所期望的要求,我们才需要考虑如何优化性能。同样的,晦涩的代码虽然提高了程序的性能,但同时可能带给我们的是维护的噩梦。我们需要折中的考虑以上两种情况,使得程序的代码是优美的,并且运行的足够快,达到客户所期望的性能要求。
优化代码甚至会导致不良的结果,Donald Knuth(一位比较牛比较有影响的人物,具体是谁,我也忘了,谁知道,可以告诉我一下,谢谢!)曾说过,“Premature optimization is the root of all evil”。在开始性能调优前,需要先指出不优化代码的一些理由。
1) 如果优化的代码已经正常工作,优化后可能会引入新的bug;
2) 优化代码趋向于使代码更难理解和维护;
3) 在一个平台上优化的代码,在另一个平台上可能更糟;
4) 花费很多时间在代码的优化上,提高了很少的性能,却导致了晦涩的代码。 确实,在优化前,我们必须认真的考虑是否值得去优化。
1.3 调优的步骤
一般我们提高应用程序的性能划分为以下几个步骤:
1) 明确应用程序的性能指标,怎样才符合期望的性能需求;
2) 在目标平台进行测试;
3) 如果性能已经达到性能指标,Stop;
4) 查找性能瓶颈;
5) 修改性能瓶颈;
6) 返回到第2步。
二 JDK调优
2.1 选择合适的JDK版本
不同版本的JDK,甚至不同厂家的JDK可能都存在着很大的差异,对于性能优化的程度不同。一般来说,尽可能选择最新发布的稳定的JDK版本。最新的稳定的JDK版本相对以前的JDK版本都会做一些bug的修改和性能的优化工作。
2.2 垃圾收集Java堆的优化
垃圾收集就是自动释放不再被程序所使用的对象的过程。当一个对象不再被程序所引用时,它所引用的堆空间可以被回收,以便被后续的新对象所使用。垃圾收集器必须能够断定哪些对象是不再被引用的,并且能够把它们所占据的堆空间释放出来。如果对象不再被使用,但还有被程序所引用,这时是不能被垃圾收集器所回收的,此时就是所谓的“内存泄漏”。监控应用程序是否发生了内存泄漏,有一个非常优秀的监控工具推荐给大家——Quest公司的JProbe工具,使用它来观察程序运行期的内存变化,并可产生内存快照,从而分析并定位内存泄漏的确切位置,可以精确定位到源码内。这个工具的使用我在后续的章节中还会做具体介绍。
Java堆是指在程序运行时分配给对象生存的空间。通过-mx/-Xmx和-ms/-Xms来设置起始堆的大小和最大堆的大小。根据自己JDK的版本和厂家决定使用-mx和-ms或-Xmx和-Xms。Java堆大小决定了垃圾回收的频度和速度,Java堆越大,垃圾回收的频度越低,速度越慢。同理,Java堆越小,垃圾回收的频度越高,速度越快。要想设置比较理想的参数,还是需要了解一些基础知识的。 Java堆的最大值不能太大,这样会造成系统内存被频繁的交换和分页。所以最大内存必须低于物理内存减去其他应用程序和进程需要的内存。而且堆设置的太大,造成垃圾回收的时间过长,这样将得不偿失,极大的影响程序的性能。以下是一些经常使用的参数设置:
1) 设置-Xms等于-XmX的值;
2) 估计内存中存活对象所占的空间的大小,设置-Xms等于此值,-Xmx四倍于此值;
3) 设置-Xms等于-Xmx的1/2大小;
4) 设置-Xms介于-Xmx的1/10到1/4之间;
5) 使用默认的设置。
大家需要根据自己的运行程序的具体使用场景,来确定最适合自己的参数设置。除了-Xms和-Xmx两个最重要的参数外,还有很多可能会用到的参数,这些参数通常强烈的依赖于垃圾收集的算法,所以可能因为JDK的版本和厂家而有所不同。但这些参数一般在Web开发中用的比较少,我就不做详细介绍了。在实际的应用中注意设置-Xms和-Xmx使其尽可能的优化应用程序就行了。对于性能要求很高的程序,就需要自己再多研究研究Java虚拟机和垃圾收集算法的机制了。可以看看曹晓钢翻译的《深入Java虚拟机》一书。
分享到:
相关推荐
什么是性能测试?为什么需要性能测试? 性能测试旨在评估系统在特定负载下的行为,包括响应时间、吞吐量、资源利用率等关键指标。其目的是验证软件能否在预期的工作负载下满足性能目标,确保用户在不同场景下的...
首先,我们需要了解什么是性能计数器。性能计数器是Windows操作系统中的一种度量工具,它记录了各种系统组件和应用程序的关键性能指标。这些指标包括但不限于CPU使用率、内存使用、磁盘I/O、网络带宽等。每个性能...
为找软件测试性能方面的ppt的人提供方便,清楚地讲出了软件性能测试的具体事项
#### 什么是性能类问题? 性能类问题通常指的是软件在处理大量并发用户请求时,出现的响应时间延长、资源利用率过高或系统崩溃等问题。这些问题可能由代码效率低下、资源分配不合理、硬件瓶颈等因素引起。 #### ...
**1.1 什么是性能** 性能是指数据库系统在处理数据时的速度与效率。对于数据库而言,性能主要体现在响应时间、吞吐量、资源利用率等方面。良好的性能能够确保系统在面对大量数据操作时依然保持高效稳定。 **1.2 ...
什么是性能测试? 性能测试是一种评估和验证软件系统在特定条件下能否满足预期性能指标的测试方法。它主要关注的是软件在高负载情况下的响应时间、吞吐量、资源利用率等方面的表现。通过性能测试,可以识别并解决...
性能测试培训资料所需PPT,包括什么是性能测试,性能测试的指标、性能测试的标准和测试方法等,欢迎下载。
Linux性能调优是系统管理员和开发人员优化Linux系统性能的重要技能。它涉及对系统资源和应用程序的分析、监控、和调整,以实现更高的效率和响应速度。本篇学习笔记详细介绍了性能分析的步骤、优化工具、性能指标的...
性能调优可以帮助vCenter Server应对更多的虚拟机负载,而性能监控则能够帮助管理员及时发现和解决潜在问题,从而避免vCenter Server成为整个虚拟化环境的瓶颈。 性能调优通常包括以下几个方面: 1. 硬件资源优化...
【RabbitMQ性能测试报告】 本测试报告详细记录了对RabbitMQ的性能评估,包括在单机模式和集群模式下的压力和稳定性测试。RabbitMQ是业界广泛使用的开源消息代理,它基于AMQP(Advanced Message Queuing Protocol)...
性能指标的定义、性能需求的分析、以及性能测试和压测等环节,都与性能设计紧密相关,任何一个环节的失误都可能导致系统上线后出现性能问题。 首先,性能需求的定义需要基于系统的实际业务场景。在设计性能需求时,...
高性能计算(High Performance Computing, 简称HPC)是指利用多处理器或计算机集群进行大规模数值计算和数据处理的能力。这种计算技术旨在解决科学、工程和商业领域中极为复杂的问题,通常涉及大量的数据处理和复杂的...
EBS(Oracle E-Business Suite)性能调优是一项关键任务,它涉及多个层次的优化,包括存储设备、主机、数据库、应用系统、网络和客户端。此文档重点聚焦于应用系统和数据库层面的调优策略,同时也涵盖了一部分Linux...
2. **压力测试报告**:压力测试是性能测试的一部分,用于确定系统在超出正常工作负载下的表现。报告通常会记录在不同压力水平下系统的响应时间、错误率和资源消耗情况,以评估系统的极限承载能力。这份模板应包含...
5. **内存管理**:Oracle的SGA(系统全局区)和PGA(程序全局区)是性能调优的重要部分。书中详细讨论了如何合理配置内存参数,以达到最佳性能。 6. **并行处理与资源调度**:并行执行可以加速大量数据处理,但需...
《高性能MySQL》是一本深入探讨MySQL数据库系统优化与管理的经典著作。这本书涵盖了MySQL的架构、历史、性能调优以及基准测试等多个重要主题,对于数据库管理员、开发人员以及对数据库性能有高要求的技术人员来说,...
### DB2 SQL性能调优秘笈 在数据库领域,IBM DB2因其稳定性和高效性而备受推崇,尤其是在大型企业级应用中。对于DB2数据库管理员(DBA)来说,掌握有效的SQL性能调优技巧至关重要。这不仅能提升系统的响应速度,还...
其中,事务指的是用户操作所涉及的一系列前后端交互过程,它是性能测试中的一个基本单元。响应时间则是指系统对用户操作做出响应所需的总时间,是衡量用户满意度的重要指标。 性能测试的范围覆盖了软件系统的多个...
性能测试是软件测试的一种,主要目的是验证软件系统或组件在特定工作负荷下的性能表现是否符合预期,这包括响应时间、吞吐量、资源利用率、可伸缩性、稳定性等。性能测试可以细分为负载测试、压力测试、稳定性测试等...