Java性能优化技巧汇总

2013-11-16  来源:本站原创  分类:Java  人气:4 

这篇文章主要介绍了Java性能优化技巧,汇总了提升java程序性能的常用技巧,非常具有实用价值,需要的朋友可以参考下

本文实例汇总了Java性能优化技巧。分享给大家供大家参考。具体分析如下:

这里参考了些书籍,网络资源整理出来,适合于大多数Java应用

在JAVA程序中,性能问题的大部分原因并不在于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()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,public int state = this.getState();

5.在java+Oracle的应用系统开发中,java中内嵌的SQL语言应尽量使用大写形式,以减少Oracle解析器的解析负担。

6.java编程过程中,进行数据库连接,I/O流操作,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销。

7.过分的创建对象会消耗系统的大量内存,严重时,会导致内存泄漏,因此,保证过期的对象的及时回收具有重要意义。
JVM的GC并非十分智能,因此建议在对象使用完毕后,手动设置成null。

8.在使用同步机制时,应尽量使用方法同步代替代码块同步。

9.尽量减少对变量的重复计算。

比如

for(int i=0;i<list.size();i++)

应修改为

for(int i=0,len=list.size();i<len;i++)

10.采用在需要的时候才开始创建的策略。

例如:

String str="abc";
if(i==1){ list.add(str);}

应修改为:

if(i==1){String str="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(int index)方法,移除此向量中指定位置的元素。将所有后续元素左移(将其索引减 1)。返回此向量中移除的元素。所以删除vector最后一个元素要比删除第1个元素开销低很多。删除所有元素最好用removeAllElements()方法。

如果要删除vector里的一个元素可以使用 vector.remove(obj);而不必自己检索元素位置,再删除,如int index = indexOf(obj);vector.remove(index);

15.当复制大量数据时,使用System.arraycopy();

16.代码重构,增加代码的可读性。

17.不用new关键字创建对象的实例。

用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用她的clone()方法。clone()方法不会调用任何类构造函数。

下面是Factory模式的一个典型实现。

public static Credit getNewCredit()
{
  return new Credit();
}
改进后的代码使用clone()方法,
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit()
{
  return (Credit)BaseCredit.clone();
}

18.乘除法如果可以使用位移,应尽量使用位移,但最好加上注释,因为位移操作不直观,难于理解。

19.不要将数组声明为:public static final。

20.HaspMap的遍历。

Map<String, String[]> paraMap = new HashMap<String, String[]>();
for( Entry<String, String[]> entry : paraMap.entrySet() )
{
  String appFieldDefId = 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.考虑使用静态方法

如果你没有必要去访问对象的外部,那么就使你的方法成为静态方法。她会被更快地调用,因为她不需要一个虚拟函数导向表。这同事也是一个很好的实践,因为她告诉你如何区分方法的性质,调用这个方法不会改变对象的状态。

28.应尽可能避免使用内在的GET,SET方法。

android编程中,虚方法的调用会产生很多代价,比实例属性查询的代价还要多。我们应该在外包调用的时候才使用get,set方法,但在内部调用的时候,应该直接调用。

29.避免枚举,浮点数的使用。

30.二维数组比一维数组占用更多的内存空间,大概是10倍计算。

31.SQLite数据库读取整张表的全部数据很快,但有条件的查询就要耗时30-50MS,大家做这方面的时候要注意,尽量少用,尤其是嵌套查找!

希望本文所述对大家的java程序设计有所帮助。

相关文章
  • Java性能优化技巧汇总 2013-11-16

    这篇文章主要介绍了Java性能优化技巧,汇总了提升java程序性能的常用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例汇总了Java性能优化技巧.分享给大家供大家参考.具体分析如下: 这里参考了些书籍,网络资源整理出来,适合于大多数Java应用 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量使用final修饰符. 带有final修饰符的类是不可派生的.在JAVA核心API中,有许多应用final的例

  • Asp.Net性能优化技巧汇总 2014-03-12

    这篇文章主要介绍了Asp.Net性能优化技巧汇总,非常实用的归纳总结,需要的朋友可以参考下 本文搜集汇总了Asp.net性能优化的各种技巧,对于Asp.Net开发人员有很好的参考借鉴价值.具体内容如下: 一.选择会话状态存储方式 在Webconfig文件配置: <sessionState mode="???" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data

  • Python代码性能优化技巧 2014-04-09

    简介:选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化来提高程序的执行效率.如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的

  • Python 代码性能优化技巧分享 2015-03-02

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化来提高程序的执行效率 如何进行 Python 性能优化,是本文探讨的主要问题.本文会涉及常见的代码优化方法,性能优化工具的使用以及如何诊断代码的性能瓶颈等内容,希望可以给 Python 开发人员一定的参考. Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下

  • Python 代码性能优化技巧 2014-02-02

    代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率. 改进算法,选择合适的数据结构 一个良好的算法能够对性能起到关键作用,因此性能改进的首要点是对算法的改进.在算法的时间复杂度排序上依次是: O(1) -> O(lg n) -> O(n lg n) -> O(n^2) -> O(n^3) -

  • LAMP服务器性能优化技巧之加速PHP 2013-10-04

    目前LAMP (Linux + Apache + MySQL + PHP) 近几年来发展迅速,已经成为Web 服务器的事实标准.本文我们将介绍基于LAMP组合的服务器的性能优化技巧:加速PHP. Apache服务器优化.PHP优化.Mysql优化 1.使用eaccelerator 我们上面的介绍Apache服务器的优化,如果您曾经浏览过 PHP 的网页时,或许会发现:怎么 PHP 的速度慢慢的,这是怎么一回事啊?PHP 不是号称速度上面的反应是很快速的吗?怎么会慢慢的呢?这是由于 PHP 的程序

  • LAMP服务器性能优化技巧之Linux主机优化 2013-10-13

    LAMP服务器性能优化技巧之Linux主机优化:由于LAMP的发展迅速,如今LAMP已经成为Web服务器的标准.如何才能优化LAMP服务器的性能? 目前LAMP (Linux + Apache + MySQL + PHP) 近几年来发展迅速,已经成为Web 服务器的事实标准. LAMP这个词的由来最早始于德国杂志"c't Magazine",Michael Kunze在1990年最先把这些项目组合在一起创造了LAMP的缩写字.这些组件虽然并不是开开始就设计为一起使用的,但是,这些开源软

  • Lua性能优化技巧(一):前言 2013-11-29

    这篇文章主要介绍了Lua性能优化技巧(一):前言,本文讲解了2条优化原则,本文是系列文章的第一篇,需要的朋友可以参考下 和在所有其他编程语言中一样,在Lua中,我们依然应当遵循下述两条有关程序优化的箴言: 原则1:不要做优化. 原则2:暂时不要做优化(对专家而言). 这两条原则对于Lua编程来说尤其有意义,Lua正是因其性能而在脚本语言中鹤立鸡群. 当然,我们都知道性能是编程中要考量的一个重要因素,指数级时间复杂度的算法会被认为是棘手的问题,绝非偶然.如果计算结果来得太迟,它就是无用的结果.因此

  • Lua性能优化技巧(三):关于表 2013-12-02

    这篇文章主要介绍了Lua性能优化技巧(三):关于表,本文讲解了一些关于表的优化技巧,需要的朋友可以参考下 一般情况下,你不需要知道Lua实现表的细节,就可以使用它.实际上,Lua花了很多功夫来隐藏内部的实现细节.但是,实现细节揭示了表操作的性能开销情况.因此,要优化使用表的程序(这里特指Lua程序),了解一些表的实现细节是很有好处的. Lua的表的实现使用了一些很聪明的算法.每个Lua表的内部包含两个部分:数组部分和哈希部分.数组部分以从1到一个特定的n之间的整数作为键来保存元素(我们稍后即将讨

  • PowerShell脚本性能优化技巧总结 2014-02-05

    这篇文章主要介绍了PowerShell脚本性能优化技巧总结,一些PowerShell脚本可能很容易消耗很多内存,或者运行太多时间,甚至兼而有之,本文会分享几个PowerShell小技巧来提高这一类脚本的性能,需要的朋友可以参考下 最终优化 在你写脚本时,不要老是想着去优化,因为你的部分优化代码可能最终被丢弃.而且老是想着优化也会降低你的生产效率,因为和CPU的时间相比,脚本编写者的时间可能会更宝贵. 使用过滤参数 PowerShell可能会消耗很多资源,因为许多Cmdlet本身的设计就是用来提供

  • LAMP服务器性能优化技巧之Apache服务器优化 2014-04-01

    目前LAMP (Linux + Apache + MySQL + PHP) 近几年来发展迅速,已经成为Web 服务器的事实标准.本文我们将介绍基于LAMP组合的服务器的性能优化技巧 1.Zend Performance Suite简介 对于Apache要把 PHP 编译其中,或者采用 DSO (动态共享对象)模式,不要采用 CGI 方式.采用DSO最重要的原因是效率.Apache是模块化设计的,所以它可以加载各种各样的服务器端脚本解释器来支持动态的网页.但是随着页面访问量的增大,CGI已经不看重

  • Lua性能优化技巧(二):基本事实 2014-07-10

    这篇文章主要介绍了Lua性能优化技巧(二):基本事实,本文讲解了一些编译器和寄存器的一些知识,需要的朋友可以参考下 在运行任何代码之前,Lua都会把源代码翻译(预编译)成一种内部的格式.这种格式是一个虚拟机指令序列,与真实的CPU所执行的机器码类似.之后,这个内部格式将会被由一个包含巨大的switch结构的while循环组成的C代码解释执行,switch中的每个case对应一条指令. 可能你已经在别处了解到,从5.0版开始,Lua使用一种基于寄存器的虚拟机.这里所说的虚拟机"寄存器"与

  • Lua性能优化技巧(六):最后的提示 2014-07-21

    这篇文章主要介绍了Lua性能优化技巧(六):最后的提示,本文是系列文章的最后一篇,其它文章请参考本文的相关文章,需要的朋友可以参考下 正如我们在前言里所说,优化是一个技巧性很强的工作,从程序是否需要优化开始,有若干个方面的内容需要考量.如果程序真的有性能问题,那么我们应该将精力集中于优化哪里和如何优化. 我们在这里讨论的技巧既不是唯一的,也不是最重要的方面.我们在这里专注于讨论专门针对Lua的优化方式,因为有很多其他的方式可以了解通用的程序优化技巧. 在本文结束之前,我还想介绍两种从更大的尺度上

  • Lua性能优化技巧(五):削减.重用和回收 2014-08-19

    这篇文章主要介绍了Lua性能优化技巧(五):削减.重用和回收,本文用多个实例讲解了这三个优化技巧,需要的朋友可以参考下 当处理Lua资源时,我们也应该遵循提倡用于地球资源的3R原则--Reduce, Reuse and Recycle,即削减.重用和回收. 削减是最简单的方式.有很多方法可以避免使用新的对象,例如,如果你的程序使用了太多的表,可以考虑改变数据的表述形式.一个最简单的例子,假设你的程序需要操作折线,最自然的表述形式是: polyline = { { x = 10.3, y = 98

  • LAMP服务器性能优化技巧之Mysql优化 2014-09-22

    目前LAMP (Linux + Apache + MySQL + PHP) 近几年来发展迅速,已经成为Web 服务器的事实标准.本文我们将介绍基于LAMP组合的服务器的性能优化技巧:Mysql优化 Apache服务器优化.PHP优化.Mysql优化 对于程序开发人员而言,目前使用最流行的两种后台数据库即为MySQL and SQL Server.这两者最基本的相似之处在于数据存储和属于查询系统.如果你想建立一个.NET服务器体系,这一体系可以从多个不同平台访问数据,参与数据库的管理,那么你可以选

  • jQuery性能优化技巧分析 2014-12-05

    这篇文章主要介绍了jQuery性能优化技巧,较为详细的分析了jQuery的常见使用技巧,非常具有实用价值,需要的朋友可以参考下 本文较为详细分析了jQuery性能优化技巧.分享给大家供大家参考.具体分析如下: 一.使用最新版本的jQuery类库 jQuery新版本会较上个版本进行Bug修复和一些优化,不过需要注意的是,在更换版本之后,不要忘记测试你的代码,毕竟有时候不是完全向后兼容的. 二.使用合适的选择器 jQuery选择器性能最佳到最差方式如下: id选择器,如$('#id', contex

  • Lua性能优化技巧(四):关于字符串 2015-02-15

    这篇文章主要介绍了Lua性能优化技巧(四):关于字符串,本文讲解了关于字符串的一些优化技巧,需要的朋友可以参考下 与表类似,了解Lua如何实现字符串可以让你更高效地使用它. Lua实现字符串的方式与多数其他脚本语言所采用的两种主要方式都不相同.首先,Lua中的所有字符串都是内部化[1]的,这意味着Lua维护着任何字符串的一个单一拷贝.当一个新字符串出现时,Lua检查是否有现成的拷贝,如果有的话,重用之.内部化使得诸如字符串对比和索引表之类的操作非常快速,但是会降低创建字符串的速度. 第二,Lua

  • php导入大量数据到mysql性能优化技巧 2015-04-09

    这篇文章主要介绍了php导入大量数据到mysql性能优化技巧,通过针对SQL语句的优化实现了mysql性能的提高,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了php导入大量数据到mysql性能优化技巧.分享给大家供大家参考.具体分析如下: 在mysql中我们结合php把一些文件导入到mysql中,这里就来分享一下我对15000条记录进行导入时分析与优化,需要的朋友可以参考一下. 之前有几篇文章,说了最近tiandi在帮朋友做一个小项目,用于统计电话号码的,每次按需求从数据库里随机生成打

  • 九大工具助你玩转Java性能优化 2013-12-31

    之前我写过一篇关于5个工具帮助写出更好的Java代码的文章.合适的工具可以改进我们的代码,并且提高开发效率.在IDR解决方案中,我们一直在找一些方法来改进我们的代码.但最近,我们在考虑改进PDF HTML5转换器和Java PDF类库代码时,发现最近我们的关注点已经开始转换到如何提升Java性能. 在这篇文章中,我会带着大家一起看一下9个可以帮助我们优化Java性能的工具.有一些我们已经在IDR Solutions中使用了,而另外一些有可能在个人项目中使用. NetBeans Profiler

  • nodejs的10个性能优化技巧 2013-11-11

    在我接触JavaScript(无论浏览器还是NodeJS)的时间里,总是遇到有朋友有多线程的需求.而在NodeJS方面,有朋友甚至直接说到,NodeJS是单线程的,无法很好的利用多核CPU.那么我们在使用过程中,就要非常注意性能优化了 下面是我们使用Node.js时遵循的10个性能规则: 1. 避免使用同步代码 在设计上,Node.js是单线程的.为了能让一个单线程处理许多并发的请求,你可以永远不要让线程等待阻塞,同步或长时间运行的操作.Node.js的一个显著特征是:它从上到下的设计和实现都是