版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第页共页关于java性能调优的方法关于java性能调优的方法java性能调优的方法程序性能的主要表现点:执行速度:程序的反映是否迅速,响应时间是否足够短内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏启动时间:程序从运行到可以正常处理业务需要花费多少时间负载承受才能:当系统压力上升时,系统的执行速度、响应时间的上升曲线是否平缓衡量程序性能的主要指标:执行时间:程序从运行到完毕所使用的时间CPU时间:函数或者线程占用CPU的时间内存分配:程序在运行时占用内容的空间磁盘吞吐量:描绘I/O的使用情况网络吞吐量:描绘网络的使用情况响应时间:系统对用户行为或者事件做出响应的时间,响应时间越短,性能越好有可能成为系统性能瓶颈的几个方面:磁盘I/O:磁盘I/O读写的速度比内容慢很多,假设程序中需要等待磁盘I/O处理,低效的磁盘I/O操作会拖累整个系统网络操作:由于网络环境的不确定性,导致网络数据读写的操作可能比本地磁盘I/O更慢,假设,网络操作处理不当,也回成为系统瓶颈CPU:对计算资要求较高的应用,由于长时间、不连续地大量占用CPU资,那么对CPU的争夺将导致系统性能问题异常:Java中的异常捕获和处理都是非常消耗资的,假设代码中高频率的异常处理,那么代码的整体系统能就会明显下降数据库:大量数据对数据库的读写操作是相当费时的,而往往很多代码中需要等到数据库操作完成之后才可以进展后续操作,这种缓慢的同步操作也将会成为系统瓶颈锁竞争:对于高并发的系统来讲,锁竞争是相当剧烈的,这对性能是一个极大的打击,锁竞争会明显增加线程上下文切换的开销,而往往这些开销都是与应用需求无关的系统开销,白白占用CPU资,带来不了任何好处内存:一般情况,只要应用程序设计合理,内存在读写速度上不太可能成为性能瓶颈。除非程序中进展了高频率的内存交换和扫描。内存成为系统瓶颈的最可能的情况就是内存大小缺乏。假设应用程序中将一些常用的核心数据存入内存,这个一定程度上会降低程序性能,因此,在将常用数据写入内存的时候,要注意一些优化处理性能调优的层次:设计调优:处于所有调优手段的上层,在软件开发之前进展,软件设计和架构对软件整体质量有决定性的影响,所以,设计调优对系统性能的影响也是最大的。其他方面的优化都是对系统微观层面上量的优化,而设计优化是对系统在宏观方面上质的优化。一个良好的系统设计可以躲避很多潜在的性能问题,因此,尽可能多花时间在系统设计上,是创立高性能程序的关键代码调优:发生在软件开发的过程中、软件开发完成后、软件维护过程中,对代码进展改进和优化,要求开发员熟悉语言的API、在适宜场景使用正确的API、对算法和数据构造灵敏运用JVM调优:需要对JVM运行原理和根本内存构造有一定理解,然后根据应用程序的特点,设置合理的JVM启动参数数据库调优:主要包括在应用层对SQL语句进展优化,对数据库进展优化(设计具有良好表构造的数据库),对数据库软件进展优化(比方使用Oracle数据库,需要设置合理大小的共享池、缓存缓冲区等)操作系统调优:不同类型的操作系统,调优的手段和参数可能会有所不同。在主流额UNIX系统中,共享内存段、信号量、共享内存最大值、共享内存最小值等都是可以进展优化的系统资根本调优策略和手段明确性能优化的目的,确定优化的`对象和最终目的(首先定位到系统的性能瓶颈,确定相关代码进展代码优化,如已无代码优化空间,那么要考虑其他方面的优化:JVM优化、数据库层面的优化、操作系统层面的优化等)。Java性能优化技巧大全1.尽量使用final修饰符。带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了使用者覆盖length方法。另外,假设一个类是final的,那么该类所有方法都是final的。java编译器会寻找时机内联〔inline〕所有的final方法〔这和详细的编译器实现有关〕。此举可以使性能平均进步50%。2.尽量重用对象。特别是String对象的使用中,出现字符串连接情况时应使用StringBuffer代替,由于系统不仅要花时间生成对象,以后可能还需要花时间对这些对象进展垃圾回收和处理。因此生成过多的对象将会给程序的性能带来很大的影响。3.尽量使用局部变量。调用方法时传递的参数以及在调用中创立的临时变量都保存在栈〔Stack〕中,速度较快。其他变量,如静态变量,实例变量等,都在堆〔Heap〕中创立,速度较慢。4.不要重复初始化变量。默认情况下,调用类的构造函数时,java会把变量初始化成确定的值,所有的对象被设置成null,整数变量设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键字创立一个对象时,构造函数链中的所有构造函数都会被自动调用。这里有个注意,给成员变量设置初始值但需要调用其他方法的时候,最好放在一个方法比方initXXX中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,publicintstate=this.getState;5.在java+Oracle的应用系统开发中,java中内嵌的SQL语言应尽量使用大写形式,以减少Oracle解析器的解析负担。6.java编程过程中,进展数据库连接,I/O流操作,在使用完毕后,及时关闭以释放资。因为对这些大对象的操作会造成系统大的开销。7.过分的创立对象会消耗系统的大量内存,严重时,会导致内存泄漏,因此,保证过期的对象的及时回收具有重要意义。JVM的GC并非非常智能,因此建议在对象使用完毕后,手动设置成null。8.在使用同步机制时,应尽量使用方法同步代替代码块同步。9.尽量减少对变量的重复计算。比方for(inti=0;i<list.size;i++)应修改为for(inti=0,len=list.size;i<len;i++)10.采用在需要的时候才开始创立的策略。例如:Stringstr=“abc”;if(i==1){list.add(str);}应修改为:if(i==1){Stringstr=“abc”;list.add(str);}11.慎用异常,异常对性能不利。抛出异常首先要创立一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace的本地方法,fillInStackTrace方法检查栈,搜集调用跟踪信息。只要有异常被抛出,VM就必须调整调用栈,因为在处理过程中创立了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。12.不要在循环中使用Try/Catch语句,应把Try/Catch放在循环最外层。Error是获取系统错误的类,或者说是虚拟机错误的类。不是所有的错误Exception都能获取到的,虚拟机报错Exception就获取不到,必须用Error获取。13.通过StringBuffer的构造函数来设定他的初始化容量,可以明显提升性能。StringBuffer的默认容量为16,当StringBuffer的容量到达最大容量时,她会将自身容量增加到当前的2倍+2,也就是2*n+2。无论何时,只要StringBuffer到达她的最大容量,她就不得不创立一个新的对象数组,然后复制旧的对象数组,这会浪费很多时间。所以给StringBuffer设置一个合理的'初始化容量值,是很有必要的!14.合理使用java.util.Vector。Vector与StringBuffer类似,每次扩展容量时,所有现有元素都要赋值到新的存储空间中。Vector的默认存储才能为10个元素,扩容加倍。vector.add(index,obj)这个方法可以将元素obj插入到index位置,但index以及之后的元素依次都要向下挪动一个位置〔将其索引加1〕。除非必要,否那么对性能不利。同样规那么适用于remove(intindex)方法,移除此向量中指定位置的元素。将所有后续元素左移〔将其索引减1〕。返回此向量中移除的元素。所以删除vector最后一个元素要比删除第1个元素开销低很多。删除所有元素最好用removeAllElements方法。假设要删除vector里的一个元素可以使用vector.remove(obj);而不必自己检索元素位置,再删除,如intindex=indexOf〔obj〕;vector.remove(index);15.当复制大量数据时,使用System.arraycopy;16.代码重构,增加代码的可读性。17.不用new关键字创立对象的实例。用new【【关键词】:^p】:创立类的实例时,构造函数链中的所有构造函数都会被自动调用。但假设一个对象实现了Cloneable接口,我们可以调用她的clone方法。clone方法不会调用任何类构造函数。下面是Factory形式的一个典型实现。publicstaticCreditgetNewCredit{returnnewCredit;}改进后的代码使用clone方法,privatestaticCreditBaseCredit=newCredit;publicstaticCreditgetNewCredit{return(Credit)BaseCredit.clone;}18.乘除法假设可以使用位移,应尽量使用位移,但最好加上注释,因为位移操作不直观,难于理解。19.不要将数组声明为:publicstaticfinal。20.HaspMap的遍历。MapparaMap=newHashMap;for(Entryentry:paraMap.entrySet){StringappFieldDefId=entry.getKey;String[]values=entry.getValue;}利用散列值取出相应的Entry做比较得到结果,获得entry的值之后直接取key和value。21.array(数组)和ArrayList的使用。array数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。22.单线程应尽量使用HashMap,ArrayList,除非必要,否那么不推荐使用HashTable,Vector,她们使用了同步机制,而降低了性能。23.StringBuffer,StringBuilder的区别在于:java.lang.StringBuffer线程平安的可变字符序列。一个类似于String的字符串缓冲区,但不能修改。StringBuilder与该类相比,通常应该优先使用StringBuilder类,因为她支持所有一样的操作,但由于她不执行同步,所以速度更快。为了获得更好的性能,在构造StringBuffer或StringBuilder时应尽量指定她的容量。当然假设不超过16个字符时就不用了。一样情况下,使用StringBuilder比使用StringBuffer仅能获得10%~15%的性能提升,但却要冒多线程不平安的风险。综合考虑还是建议使用StringBuffer。24.尽量使用根本数据类型代替对象。25.用简单的数值计算代替复杂的函数计算,比方查表方式解决三角函数问题。26.使用详细类比使用接口效率高,但构造弹性降低了,但现代IDE都可以解决这个问题。27.考虑使用静态方法假设你没有必要去访问对象的外部,那么就使你的方法成为静态方法。她会被更快地调用,因为她不需要一个虚拟函数导向表。这同事也是一个很好的理论
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026福建临汕能源科技有限公司直聘人员招聘7人考试参考题库及答案解析
- 2026江苏南京大学XZ2026-021海外教育学院行政主管招聘考试参考题库及答案解析
- 2026年哈尔滨市第七十中学校招聘临聘教师2人考试参考题库及答案解析
- 2026天津市地质矿产勘查开发局所属事业单位招聘19人 (含高层次人才)考试参考试题及答案解析
- 2026年河北政法职业学院公开选聘工作人员13名考试参考试题及答案解析
- 2026广东广州市花都区新华街第二小学招聘临聘教师1人考试参考题库及答案解析
- 2026海南陵水黎族自治县数字投资有限公司招聘9人考试参考试题及答案解析
- 2026云南玉溪市新平长水高级中学有限公司就业见习岗位招募9人考试参考题库及答案解析
- 2026浙江嘉兴市数智安责险服务保障中心招募考试参考试题及答案解析
- 2026年中国联通宿州市埇桥区分公司招聘考试备考试题及答案解析
- 胎儿疾病预后评估方案
- 2025-2026学年外研版(三起)(新教材)小学英语三年级下册教学计划附进度表
- 2026春节后建筑施工复工复产开工第一课
- 2025年律师事务所党支部书记年终述职报告
- 围术期精准管理:个体化麻醉与镇痛
- 2025年中国家装行业白皮书(一起装)
- 2026年湖南理工职业技术学院单招职业倾向性考试题库附答案详解
- 生产计划转正述职报告
- 硫酸镁使用方法
- 《无人机组装与调试》课程标准 -
- 烟草行业消费者行为分析
评论
0/150
提交评论