一 基本知识
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虚拟机》一书。
更多信息请查看 java进阶网 http://www.javady.com
分享到:
相关推荐
阿里巴巴Java性能调优实战(2021华山版) 本资源摘要信息来自阿里巴巴Java性能调优实战(2021华山版),旨在帮助Java开发者掌握性能调优的实战经验和技术。 性能调优的重要性 性能调优是软件开发中一个非常重要的...
阿里巴巴作为全球领先的科技企业,在Java开发和性能调优方面积累了丰富的实践经验,并将这些知识和经验总结提炼,编写成了《阿里+Java+开发手册、阿里巴巴Java性能调优实战》两本专业书籍。它们分别以嵩山版和华山版...
阿里巴巴Java性能调优实战
阿里巴巴Java性能调优华山版是一套系统性能调优教程,!通过这份笔记的学习,你将会有一个系统的调优头脑和策略!快了何止100%?需要的朋友可下载试试! 众所周知性能调优可以使系统稳定,用户体验更佳,甚至在...
Java性能调优 6步实现项目性能全面升级+面试高频性能问题讲解视频教程分享,性能优化的N种企业级解决方案,囊括了【数据库优化】、【Tomcat优化】、【JVM优化】、【垃圾回收】、【Netty优化】、【Nginx优化】、...
Java性能调优是一个复杂而重要的领域,涉及到程序的运行效率、资源消耗以及系统的稳定性。这份“Java性能调优大全”提供了全面的指南,包括VisualVM的使用、JVM的性能优化、OMM(可能是指Oracle Management Monitor...
阿里巴巴Java性能调优实战(2021华山版) 本资源提供了一份阿里巴巴Java性能调优实战指南,旨在帮助Java开发者提高系统性能。该指南共分七大模块,每个模块都涵盖了Java应用服务的不同方面的性能优化。 第一个模块...
### Java性能调优知识点概述 #### 一、高性能Java代码编写原则 - **算法与数据结构**:选择合适的数据结构可以极大地提升程序运行效率。例如,对于查找操作频繁的场景,哈希表(如`HashMap`)比链表或数组更高效。...
《阿里巴巴Java性能调优实战(2021华山版)》是一本专注于Java应用程序性能优化的专业书籍,由阿里巴巴的技术专家团队倾力打造。这本书基于阿里巴巴的实际业务场景,结合丰富的实践经验,为Java开发者提供了深入、...
《阿里巴巴java性能调优实战手册》便是为了解决这一难题,向Java开发者们提供了一套实战指南,帮助他们提升软件性能和稳定性。 作者在书中开篇即以自己的故事带入,描述了在大型项目中遇到的性能瓶颈,以及通过与...
以下是一些常用的Java性能调优命令及其用法和相关知识点。 1. jps命令用于列出所有的JVM实例。通过该命令,开发者可以快速查看本机上所有Java应用程序的进程ID。例如,使用`jps`可以列出本机所有的JVM实例。 2. ...
本专题“47-Java性能调优实战”聚焦于电商系统的分布式事务处理,旨在帮助开发者掌握如何有效地解决内存持续上升的问题以及优化网络通信和NIO实现。 首先,内存持续上升是Java应用中常见的性能问题,可能导致系统...
78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优实战.zip78-Java性能调优...
【Java性能调优指南】 在Java开发中,性能调优是一项关键任务,它涉及到程序运行效率、资源利用和系统稳定性。本指南主要关注Java虚拟机(JVM)调优、编码最佳实践以及微基准测试的重要性。 **基本规则** 1. **...
Java性能调优工具及方法介绍 可配合工具用于内存泄漏问题快速排查
### Java性能调优概述 #### 一、性能优化的重要性与基本概念 在现代软件开发中,性能优化是一项至关重要的任务。对于Java开发者来说,优化不仅仅意味着让程序运行更快,还包括了减少内存消耗、提高响应速度等多个...
Java性能调优工具简介,包括Linux系统层面的调优工具介绍和java层面调优的工具介绍
Java 性能调优 Java 性能调优
java 性能调优, 来自于内部分享。 java 性能调优, 来自于内部分享。
Java性能调优是Java开发中的重要环节,它关乎应用程序的运行效率、资源占用以及用户体验。这份"java性能调优及原理介绍"的压缩包文件,很显然是为了帮助开发者深入理解并掌握这一技能。以下是根据标题和描述提炼出的...