java性能调优的基本知识_第1页
java性能调优的基本知识_第2页
java性能调优的基本知识_第3页
java性能调优的基本知识_第4页
java性能调优的基本知识_第5页
免费预览已结束,剩余7页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java 堆是指在程序运行时分配给对象生存的空间。通过-mx/-Xmx 和-ms/-Xms 来设置起始堆的大小和最大堆的大小。根据自己 JDK 的版本和厂家决定使用-mx 和-ms 或-Xmx 和-Xms。Java 堆大小决定了垃圾回收的频度和速度,Java 堆越大,垃圾回收的频度越低,速度越慢。同理,Java 堆越小,垃圾回收的频度越高,速度越快。要想设置比较理想的参数,还是需要了解一些基础知识的。Java 堆的最大值不能太大,这样会造成系统内存被频繁的交换和分页。所以最大内存必须低于物理内存减去其他应用程序和进程需要的内存。而且堆设置的太大,造成垃圾回收的时间过长,这样将得不偿失,极大的影

2、响程序的性能。以下是一些经常使用的参数设置:1)设置-Xms 等于-XmX 的值;2)估计内存中存活对象所占白空间的大小,设置-Xms 等于此值,-Xmx 四倍于此值;3)设置-Xms 等于-Xmx 的 1/2 大小;4)设置-Xms 介于-Xmx 的 1/10 至 U1/4 之间;5)使用默认的设置。大家需要根据自己的运行程序的具体使用场景,来确定最适合自己的参数设置。除了-Xms 和-Xmx 两个最重要的参数外,还有很多可能会用到的参数,这些参数通常强烈的依赖于垃圾收集的算法,所以可能因为 JDK 的版本和厂家而有所不同。但这些参数一般在 Web 开发中用的比较少,我就不做详细介绍了。在实

3、际的应用中注意设置-Xms 和-Xmx 使其尽可能的优化应用程序就行了。对于性能要求很高的程序,就需要自己再多研究研究 Java 虚拟机和垃圾收集算法的机制了。可以看看曹晓钢翻译的深入 Java 虚拟机一书。Java 程序性能调优的基本知识和 JDK调优一基本知识1.1性能是什么在性能调优之前,我们首先来了解一下性能是什么?关于性能,我想每个学习过 Java 的人都能列出几点,甚至可以夸夸其谈。在JavaTMPlatformPerformance一书中,定义了如下五个方面来作为评判性能的标准:1)运算的性能一一哪一个算法的执行性能最好?2)内存的分配一一程序运行时需要耗费多少内存?3)启动的时

4、间一一程序启动需要多长时间?这在 Web 项目中的影响不大,但要注意部分程序需要部署或运行在客户端时的情形(比如 applet 程序)。4)程序的可伸缩性一一在压力负载的情况下,程序的性能如何?5)性能的感知一一用户在什么情况下会觉得程序的性能不好?以上五个方面,在具体的使用场景可以有选择的去评判。至于这五方面的性能调优,在后续的章节中将会陆续的给以相应的性能调优策略。1.2调优的规则我们只需要关心对我们程序有影响,可以察觉到的性能问题,而不是每一个类中的每一个方法我们都需要想方设法的提高性能。如果程序的性能没有达到我们所期望的要求,我们才需要考虑如何优化性能。同样的,晦涩的代码虽然提高了程序

5、的性能,但同时可能带给我们的是维护的噩梦。我们需要折中的考虑以上两种情况,使得程序的代码是优美的,并且运行的足够快,达到客户所期望的性能要求。优化代码甚至会导致不良的结果,DonaldKnuth(一位比较牛比较有影响的人物,具体是谁,我也忘了,谁知道,可以告诉我一下,谢谢!)曾说过,Prematureoptimizationistherootofallevil 在开始性能调优前,需要先指出不优化代码的一些理由。1)如果优化的代码已经正常工作,优化后可能会引入新的 bug;2)优化代码趋向于使代码更难理解和维护;3)在一个平台上优化的代码,在另一个平台上可能更糟;4)花费很多时间在代码的优化上,

6、提高了很少的性能,却导致了晦涩的代码。确实,在优化前,我们必须认真的考虑是否值得去优化。1.3调优的步骤一般我们提高应用程序的性能划分为以下几个步骤:1)明确应用程序的性能指标,怎样才符合期望的性能需求;2)在目标平台进行测试;3)如果性能已经达到性能指标,Stop;4)查找性能瓶颈;5)修改性能瓶颈;6)返回到第 2 步二 JDK 调优1)选择合适的 JDK 版本不同版本的 JDK,甚至不同厂家的 JDK 可能都存在着很大的差异,对于性能优化的程度不同。一般来说,尽可能选择最新发布的稳定的 JDK 版本。最新的稳定的 JDK 版本相对以前的 JDK 版本都会做一些bug 的修改和性能的优化工

7、作。1)垃圾收集 Java 堆的优化垃圾收集就是自动释放不再被程序所使用的对象的过程。当一个对象不再被程序所引用时,它所引用的堆空间可以被回收,以便被后续的新对象所使用。垃圾收集器必须能够断定哪些对象是不再被引用的,并且能够把它们所占据的堆空间释放出来。如果对象不再被使用,但还有被程序所引用,这时是不能被垃圾收集器所回收的,此时就是所谓的“内存泄漏”。 监控应用程序是否发生了内存泄漏, 有一个非常优秀的监控工具推荐给大家一一 Quest 公司的 JProbe 工具,使用它来观察程序运行期的内存变化,并可产生内存快照,从而分析并定位内存泄漏的确切位置,可以精确定位到源码内。这个工具的使用我在后续

8、的章节中还会做具体介绍。Java 堆是指在程序运行时分配给对象生存的空间。通过-mx/-Xmx 和-ms/-Xms 来设置起始堆的大小和最大堆的大小。根据自己 JDK 的版本和厂家决定使用-mx 和-ms 或-Xmx 和-Xms。Java 堆大小决定了垃圾回收的频度和速度,Java 堆越大,垃圾回收的频度越低,速度越慢。同理,Java 堆越小,垃圾回收的频度越高,速度越快。要想设置比较理想的参数,还是需要了解一些基础知识的。Java 堆的最大值不能太大,这样会造成系统内存被频繁的交换和分页。所以最大内存必须低于物理内存减去其他应用程序和进程需要的内存。而且堆设置的太大,造成垃圾回收的时间过长,

9、这样将得不偿失,极大的影响程序的性能。以下是一些经常使用的参数设置:1)设置-Xms 等于-XmX 的值;2)估计内存中存活对象所占的空间的大小,设置-Xms 等于此值,-Xmx 四倍于此值;3)设置-Xms 等于-Xmx 的 1/2 大小;4)设置-Xms 介于-Xmx 的 1/10 到 1/4 之间;5)使用默认的设置。大家需要根据自己的运行程序的具体使用场景,来确定最适合自己的参数设置。除了-Xms 和-Xmx两个最重要的参数外,还有很多可能会用到的参数,这些参数通常强烈的依赖于垃圾收集的算法,所以可能因为 JDK的版本和厂家而有所不同。但这些参数一般在 Web#发中用的比较少,我就不做

10、详细介绍了。在实际的应用中注意设置-Xms 和-Xmx 使其尽可能的优化应用程序就行了。对于性能要求很高的程序,就需要自己再多研究研究 Java 虚拟机和垃圾收集算法的机制了。可以看看曹晓钢翻译的深入 Java虚拟机一书Web 应用程序调优指南时间:2009-09-0922:45:36 来源:网络作者:未知点击:120 次一.成功的应用都是相似的,失败的应用各有各的失败一.成功的应用都是相似的,失败的应用各有各的失败对于 Web 应用来说,影响性能的集中体现在网络/CPU/内存/IO/数据库/缓存这 6 个环节的处理上。一个稳定应用的特征应该包括:网络流量平稳,连接数保持稳定低 CPU 负载内

11、存曲线平稳IO 高响应数据库的低负载,高响应简单的来说,对于每个不稳定的应用来说,都会有一个瓶颈,通过以上的工具分析,加上自己的判断,找到那个瓶颈,解决它!我们可以通过以下监控工具可监控到应用的各项指标网络监控工具 Cacti,可以监控到整个服务器的流量/硬盘/CPU 负载等情况JVM 监控 JConsole(JDK1.5 以上版本自带),%JAVA_HOME%binjconsoleJava 启动加上一下参数:-Dcom.sun.management.jmxremote.port=5004(监控端口)-Dcom.sun.management.jmxremote.ssl=false-Dcom.s

12、un.management.jmxremote.authenticate=falseVisualVM(JDK1.6_07 以上版本自带)%JAVA_HOME%binjvisualvm配置方法同 JConsole,VisualVM 比 JConsole 多了一个实用功能 TheadDump.TheadDump 可以很清晰的告诉你 JVM 当前正在做什么,内存里有哪些进程,是否有死锁。重点观察 RUNNABLE 和 LOCK 是否有死锁。5.数据库查看MySql 的 showprocesslist 命令二.调优手段和策略网络层优化不同类型的应用所能承受的网络负载各不相同,对于长连接应用来说,比如下

13、载应用,所能承受的连接数就相对低,对于短链接应用,比如计数应用,所能承受的连接数就相对高,对于一般有数据库的应用来说,每秒的连接数保持在 700 以下都是没问题的。这里调优的方面包括:Linux 可以优化网络的 TCP 参数,提高网络的响应,增加服务器实现负载均衡,目的降低单台服务器流量优化程序,尽可能的减少处理的时间,如果一定有长时间处理的场景,可以采用异步方式处理。先返回一个请求 ID,然后客户端再通过这个 ID 来获得结果。CPU 优化就目前的硬件环境来看,CPU 都不会是一个瓶颈。如果 CPU 出现负载高,基本上都是程序处理不当引起,比如有深度递归或者循环或者频繁写磁盘,一旦出现高负载

14、,会引起一系列的连锁反应,响应降低,连接数增加。这个环节主要是优化程序:b4d7977ef04-Numbered_3c7e40f3-3442-4961-9e94-8192fa4b减少循环和递归b4d7977ef04-Numbered_3c7e40f3-3442-4961-9e94-8192fa4b减少 synchronized 的用法。对于多服务器场景,要实现锁机制,用 synchronized 不一4.Kill-3 来获取 TheadDump定适合。Synchronized 使用不当,极容易造成死锁。b4d7977ef04-Numbered_3c7e40f3-3442-4961-9e94-8

15、192fa4b减少死锁发生的可能性。JConsole 提供了一个检测死锁的方法,TheadDump 也可以分析死锁。内存优化对于 Java 应用来说,内存调优是关键。先来认识一下 Java 内存的构成和垃圾回收的机制:堆是应用程序使用的主要部分,一旦堆满,应用程序就会抛出 OutOfMemory 错误。具体关于堆的构成以及垃圾回收算法,可以参考文档:http:/ JVM 内存, 使得可使用的堆内存尽可能多,延长垃圾回收的时间。需要注意的是,一般来说,回收 1G 内存所需要的时间是 7 秒左右,如果这个时间访问量比较高,极容易导致应用停止响应,所以并非是越大内存越好。通过增加 XX:+Print

16、GCDetails 参数可以观察到垃圾回收的频率和时间 2)调整垃圾回收策略,加快 JVM 的回收,因为 Web 应用响应高,很多都是无用内存,加快回收可以保证有效堆会更多,这种方式会消耗更多的 CPU。IO 优化为了提高 IO 的响应,尽可能的不要把所有文件写到同一个目录下,所有的请求集中在一个磁盘上。当一个目录下超过 2000 个文件,就会导致 IO 响应下降。这个环节调优包括5fd4c-99d6-4566-a4c9-38fb3d203c20-Numbered_0%98d07采用更快的 IO 设备,比如 NAS 存储设备5fd4c-99d6-4566-a4c9-38fb3d203c20-N

17、umbered_0%98d07如果可能,将文件缓存到内存,或者先写内存,定时回写磁盘。5fd4c-99d6-4566-a4c9-38fb3d203c20-Numbered_0%98d07将读和写操作分开来实现。比如一个线程只写,一个线程只读。数据库优化这个环节可以优化的地方比较多,通常由以下几个方面: 搀愀昀挀 一甀洀戀攀爀攀搀开挀愀挀 搀 愀 愀昀 65536513057 愀 愀戀攀昀 一甀洀戀攀爀攀搀开搀 愀昀 搀昀愀戀昀昀建立索引 搀愀昀挀 一甀洀戀攀爀攀搀开挀愀挀 搀 愀 愀昀 65536523057 愀 愀戀攀昀 一甀洀戀攀爀攀搀开搀 愀昀 搀昀愀戀昀昀对于复杂的业务逻辑,采用存储过

18、程实现 搀愀昀挀 一甀洀戀攀爀攀搀开挀愀挀 搀 愀 愀昀 65536533057 愀 愀戀攀昀 一甀洀戀攀爀攀搀开搀 愀昀 搀昀愀戀昀昀对于大数据量,采用归档或者分表方式进行处理。比如 100 万的数据要 0.1 秒就读取出来,如果采用分表,降低的数据规模,实现这个是不难的。缓存这个的最终目的是为了保证以上各个环节顺畅。缓存从架构上来分包括集中式缓存,如 Memcached分布式缓存,如 OpenJPA 的二级缓存,采用 JGroup 方式来同步从类型上来分包括页面缓存,页面缓存可以定时更新数据缓存,可以先把数据缓存到内存,然后定时写入数据库。三.构架一个稳定应用应用分类首先要认识到,不同的应

19、用需要的资源和处理的方式是不一样的,所以在开发一个应用之前,要认识到应用的特征及其可能的瓶颈。为每类应用定制一个解决套餐,是成功的基础。可重用的处理模型要建立一个可重用的程序库,比如计数框架,缓存框架,模板框架。当你需要的时候,不是重新开发,而是拿过来直接使用就可以了。持续监控和改进随着时间的推移,应用所需要的资源也会不同,有些应用可能比预想的差,需要减少资源,有些发展迅猛,需要增加资源。这些都需要我们建立一个可持续的监控机制。四.常见不稳定问题处理办法1.内存只涨不降查看一下网络流量,看是否是持续增加,如果网络流量正常,很可能你的程序有内存泄漏问题。建议的办法:改程序/增加内存或者提高垃圾回

20、收的频率。更多有待完善中。本指南不是一个教科读书,更多的是经验总结,目的是为了开发高响应/高并发的 Web应用,会不断的补充完善,如果需要具体的帮助,可以 Google 一下。http:/ http:/原文链接误区 1:索引创建得越多越好?实际上:创建的索引可能建立后从来未使用。索引的创建也是需要代价的,对于删除、某些更新、插入操作,对于每个索引都要进行相应的删除、更新、插入操作。从而导致删除、某些更新、插入操作的效率变低。误区 2:对于一个单表的查询,可以索引 1 进行过滤再使用索引 2 进行过滤?实际上:假设查询语句如下 select*fromt1wherec1=1andc2=2,cl 列

21、和c2 列上分别建有索引 ic1、 ic2。先使用 ic1(或 ic2)进行过滤, 产生的结果集是临时数据,不再具有索引,所以不可使用 ic2(或 ic1)进行再次过滤。索引优化的基本原则:1、将索引和数据存放到不同的文件组没有将表数据和索引数据存储到不同的文件组,而不加区别地将它们存储到同一文件组。这样,不但会造成 I/O 竞争,也为数据库的维护工作带来不变。2、组合索引的使用假设存在组合索引 it1c1c2(c1,c2),查询语句 select*fromt1wherec1=1andc2=2 能够使用该索引。查询语句 select*fromt1wherec1=1 也能够使用该索引。但是,查询

22、语句select*fromt1wherec2=2 不能够使用该索引,因为没有组合索引的引导列,即,要想使用 c2 列进行查找,必需出现 c1 等于某值。根据 where 条件的不同,归纳如下:c1=1andc2=2:使用索引 it1c1c2 进行等值查找。c1=1andc22:使用索引 it1c1c2 进行范围查找,可以有两种方法。方法 1,使用通过索引键(1,2)在 B 树中命中一条记录,然后向后扫描找出第一条符合条件的记录,从此记录往后的每一条记录都是符合条件的。这种方法的弊端在于:如果c1=1andc2=2 对应的记录数很多,会产生很多无效的扫描。方法 2,如果 c2 对应的 int 型

23、数据,可以使用索引键(1,3)在 B 树中命中一条记录,从此记录往后的每一条记录都是符合条件的。本文中的例子均采用方法 1。3)c11andc2=2:因为索引的第一个列不是等于号的,索引即使后面出现了c2=2,也不能将 c2=2 应用于索引查找。这里,通过索引键(1,-oo)在B树中命中一条记录,向后扫描找出第一条符合 c11 的记录,此后的每一条记录判断是否符合 c2=2,如果符合则输出,否则过滤掉。这里我们称 c2=2 没有参与到索引运算中去。这种情况在实际应用中经常出现。4)c11:通过索引键(1,-8)在 B 树中命中一条记录, 以此向后扫描找出第一条符合 c11的记录,此后的每条记录

24、都是符合条件的。3、唯一索引与非唯一索引的差异假设索引 int1c1(c1)是唯一索引, 对于查询语句 selectc1fromt1wherec1=1,达梦数据库使用索引键(1)命中 B 树中一条记录,命中之后直接返回该记录(因为是唯一索引,所以最多只能有一条 c1=1 的记录)。假设索引 it1c2(c2)是非唯一索引,对于查询语句 selectc2fromt2wherec2=2,达梦数据库使用索引键(2)命中 B 树中一条记录,返回该记录,并继续向后扫描,如果该记录是满足 c=2,返回该记录,继续扫描,直到遇到第一条不符合条件 c2=2 的记录。于是,我们可以得知,对于不存在重复值的列,创

25、建唯一索引优于创建非唯一索引。4、非聚集索引的作用每张表只可能一个聚集索引,聚集索引用来组织真实数据。语句“createtableemployee(idintclusterprimarykey,namevarchar(20),addrvarchar(20)”。表 employee 的数据用 id 来组织。如果要查找 id=1000 的员工记录,只要用索引键(1000)命中该聚集索引。但是,对于要查找 name=张三的员工记录就不能使用该索引了,需要进行全表扫描,对于每一条记录判断是否满足 name=张三,这样会导致查询效率非常低。要使用聚集索引,必需提供 id,我们只能提供 name 于是需要引入一个辅助结构实现nameiUid 的转换,这就是非聚集索引的作用。该非聚集索引的键是 name 值是 id。于是语句“select*fromemployeewherename=张三”的执行流程是: 通过键(张三)命中非聚集索引,得到对应的 id 值 3(假设张三对应的 id 为 3),然后用键命中聚集索引,得到相应的记录。5、是不是使用非聚集索引的查询都

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论