转载自:http://www.open-open.com/lib/view/open1399884636989.html#_label20

  1.没有必要时不要使用静态变量

  使用静态变量的目的是提高程序的运行性能;被static修饰的变量是不会被回收的。因此不经常使用的变量或者对象,需要仔细考量是否有必要设置为static。

  2.充分利用单利

  单利的好处是减少对资源的加载缩短运行时间,提高效率。

  单利试用的场景有两种:

  1.控制资源使用上,通过线程同步控制资源的并发访问。

  2.控制实例的产生,以达到节省资源的目的。

  3.减少对象的创建

  为何要避免在经常调用的方法中循环使用new对象呢?

  1.系统需要花费时间来创建对象

  2.系统需要花费时间进行垃圾回收处理。

  因此在可控范围时间内,最大限度重用对象。尽可能使用数据类型或者数据来代替对象。

  4.使用final修饰符

  java虚拟机会内联所有的final方法,使性能提高50%.(此处不理解!)

  5.尽量使用局部变量

  为什么呢要尽可能使用局部变量?调用方法传递的参数以及在调用创建临时变量都分配给方法的栈中,速度快。静态变量或者实力变量实在堆中创建,速度比较慢。

  6.处理好包装类和基本类型的使用场所

  虽然包装类型和基本类型在使用过程中可以相互转换,但是两者的内存区域完全不同。基本数据类型产生、处理和栈有关系。包装类型是实例,在堆中产生实例。在集合类对象中,对象需要进行包装处理。在其它方面,提倡建议使用基本类型。

  7.学会使用StringBuilder和StringBuffer

  单线程使用StringBuilder,线程不安全,性能特别高;多线程使用StringBuffer,线程安全,并且性能提升。 

  8.尽可能不要使用finalize方法

  为什么将资源放在finalize方法中是不好的选择?gc处理Young代内存时,引起程序暂停。再使用finalize方法处理,gc负担更大。(具体参考《深入理解java虚拟机》,重写finalize方法会让被处理的对象可能会起死回生的!)

  9.尽量使用基本数据类型代替对象

  String str = “hello”;内存情况是在方法区运行时常量池产生字符串常量hello;

  String str = new String(“hello”);内存情况,不仅在方法区常量池创建hello常量,还在堆中创建char[]来保存h,e,l,l,o.增加内存开销,还需要进行垃圾回收处理。

  10.学会使用HashMap,ArrayList

  HashTable,Vector线程安全,内部使用同步机制,会降低性能。

  11.理解HashMap原理

  需要创建比较大的HashMap时,充分利用public HashMap(int initialCapacity,float loadFactor)避免HashMap多次进行重构。扩容耗费性能,默认initialCapacity等于16,loadFactor等于0.75,你最好需要准确估计最佳性能大小。

  12.减少对变量的重复计算

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

  应该写成for(int i=0,len=list.size();i<len;i++)

  并且在循环中英gia避免使用复杂的表达式,循环中,循环条件会被反复计算。如果不使用复杂的表达式,而循环条件值不变,程序运行速度会更快。

  12.避免不必要的对象创建

  A a = new A();

  if(i == 1){ list.add(a);}

  应该写成:

  if(i == 1){ A a = new A(); list.add(a);}

  本质上是减小创建对象的作用域。

  13.尽量在finally块中释放资源

  程序中使用的源尽可能在finally中释放,因为不管程序运行的结果如何,finally块总是会被执行的,保证资源正确关闭。

  14.使用移位来代替乘法或者除法(a/b,仅适合和2相关的乘除)

  /是代价很高的操作,使用移位操作更快更有效

  int num = a / 4;  //int num = a >>2;

  int num = a / 8;   //int num = a >>3;

  int num = a * 4;  //int num = a <<2;

int num = a * 8;  //int num = a <<3;

  位移应该加注释,移位操作不直观,可读性差,但是效率高。

  15.确定StringBuffer的容量

  StringBuffer的构造器会创建默认大小16的字符数组,如果超过这个数字,就会重新分配内存,创建更大的数字,将原来的数据复制过来,丢弃就的数组。因为为提高性能,在创建StringBuffer时指定大小,避免容量不够进行自增长,以提高性能。

  eg:StringBuffer bufer = new StringBuffer(1000); 

  16.尽量避免使用sprit

  为什么尽可能避免使用sprit呢?split支持正则表达式,效率比较低。如果频繁上百上万几十万的调用,会耗费大量资源。如果需要频繁调用sprit时,可以考虑使用apache的StringUtils.sprit(string,split),频繁split的可以缓存结果。

  17.ArrayList和LinkList

  前者基础是数组;后者基础是链表。查询数据频繁可以使用前者,需要频繁插入删除数据使用后者。

  18.尽量使用System.arraycopy()代替通过循环复制数组

  System.arraycopy()复制数据效率快。

  19.尽量缓存经常使用的对象

  经常使用的对象进行缓存,可以提高程序运行性能。 

  20.尽量避免非常大的内存分配

  不要创建短命的需要大内存的对象,gc后可能得不到连续块内存空间,需要再次进行gc,会严重影响性能。

  21.慎用异常

  创建异常时,需要收集栈跟踪,用来描述异常何时创建的。建立栈耿宗,需要为运行时栈做快照,性能开销非常大。

  创建异常开销比较大,好在捕获异常开销不大,可以进行try..catch处理;或者进行异常抛出。

   

  

  

    

    

  

  

2016030401 - java性能优化建议的更多相关文章

  1. Java 性能优化之 String 篇

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/ Java 性能优化之 String 篇 String 方法用于文本分析 ...

  2. 《Java性能优化权威指南》

    <Java性能优化权威指南> 基本信息 原书名:Java performance 原出版社: Addison-Wesley Professional 作者: (美)Charlie Hunt ...

  3. 推荐:Java性能优化系列集锦

    Java性能问题一直困扰着广大程序员,由于平台复杂性,要定位问题,找出其根源确实很难.随着10多年Java平台的改进以及新出现的多核多处理器,Java软件的性能和扩展性已经今非昔比了.现代JVM持续演 ...

  4. 【转】10种简单的Java性能优化

    10种简单的Java性能优化 2015/06/23 | 分类: 基础技术 | 14 条评论 | 标签: 性能优化 分享到: 本文由 ImportNew - 一直在路上 翻译自 jaxenter.欢迎加 ...

  5. 44个Java性能优化

    44个Java性能优化 首先,代码优化的目标是: 减小代码的体积 提高代码运行效率 代码优化细节 1 .尽量指定类.方法的final修饰符 ​ 带有final修饰符的类是不可派生的.在Java核心AP ...

  6. Java 性能优化的55个细节(珍藏版)

    在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间 ...

  7. Java性能优化,操作系统内核性能调优,JYM优化,Tomcat调优

    文章目录 Java性能优化 尽量在合适的场合使用单例 尽量避免随意使用静态变量 尽量避免过多过常地创建Java对象 尽量使用final修饰符 尽量使用局部变量 尽量处理好包装类型和基本类型两者的使用场 ...

  8. 【Java 调优】Java性能优化

    Java性能优化的50个细节(珍藏版) 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: ...

  9. java 性能优化(代码优化)

    参考博文: java 性能优化:35 个小细节,让你提升 java 代码的运行效率

随机推荐

  1. chrome扩展——Postman

    今天须要測试一个http的接口,曾经都是使用java的httpClient工具jar,自己编写代码去调试,但这样的方式比較死板,每次都要执行一段代码...于是就像有没有类似的在线工具能够使用? 调查了 ...

  2. Redis学习手册(String数据类型)

    一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...

  3. 系统数据文件和信息之附加组ID

    4.2BSD引入了附加组ID(supplementary group ID)的概念.我们不仅可以属于口令文件记录项中组ID所对应的组,也可属于多达16个另外的组.文件访问权限检查相应被修改为:不仅将进 ...

  4. 摄像机(CCCamera)

  5. 【Unicode】字符编码表信息

    UTF-8有点类似于Haffman编码,它将Unicode编码为:0x00-0x7F的字符,用单个字节来表示:0x80-0x7FF的字符用两个字节表示:0x800-0xFFFF的字符用3字节表示:   ...

  6. checkbox组件

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. KafkaSpout 浅析

    最近在使用storm做一个实时计算的项目,Spout需要从 KAFKA 集群中读取数据,为了提高开发效率,直接使用了Storm提供的KAFKA插件.今天抽空看了一下KafkaSpout的源码,记录下心 ...

  8. Android(java)学习笔记210:采用post请求提交数据到服务器(qq登录案例)

    1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...

  9. Android(java)学习笔记162:Android启动过程(转载)

    转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...

  10. Vivado学习笔记_002

    经过几天的试用逐渐熟悉了vivado,和ISE相比vivado确实有了很多改良. 发现了以下几个特点:   1.数据格式统一了 在以往的设计中,保存数据的格式非常多.ISE有很多种格式的文件,在tra ...