Java性能的优化细节

2020-09-03  本文已影响0人  Liuzhoulin

一、在合适的场合使用单例,适用场景如下:

    1)控制资源的使用,通过线程同步来控制资源的并发访问;

    2)控制实例的产生,以达到节约资源的目的;

    3)控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。  

二、避免随意使用静态变量

    当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存。

三、避免过多过常地创建Java对象

    尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。

四、使用局部变量

    调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快;其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。

五、处理好包装类型和基本类型两者的使用场所

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

六、使用基本数据类型代替对象

七、合理的创建HashMap

八、减少对变量的重复计算

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

    应改为

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

九、尽量使用懒加载策略,即在需要的时候才创建

十、在finally块中释放资源

十一、使用移位来代替'a/b'的操作

十二、确定StringBuffer的容量

    StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,你可以在创建 StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。

十三、避免使用二维数组

    二维数据占用的内存空间比一维数组多得多,大概10倍以上。

十四、避免使用split

    除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。

十五、ArrayList & LinkedList

    一个是线性表,一个是链表,一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指针,添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据。

十六、使用System.arraycopy ()代替通过来循环复制数组

十七、缓存经常使用的对象

    尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。

十八、避免非常大的内存分配

十九、慎用异常

二十、重用对象

二十一、不要重复初始化变量

二十二、及时关闭IO

二十三、不要在循环中使用Try/Catch语句,应把Try/Catch放在循环最外层

二十四、array(数组)和ArrayList的使用

    array 数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。

二十五、单线程使用 HashMap, ArrayList

    除非必要,否则不推荐使用HashTable,Vector,它们使用了同步机制,而降低了性能。

二十六、StringBuffer,StringBuilder的区别

    java.lang.StringBuffer 线程安全的可变字符序列。一个类似于String的字符串缓冲区,但不能修改。StringBuilder与该类相比,通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。为了获得更好的性能,在构造StringBuffer或StringBuilder时应尽量指定她的容量。当然如果不超过16个字符时就不用了。相同情况下,使用StringBuilder比使用StringBuffer仅能获得10%~15%的性能提升,但却要冒多线程不安全的风险。综合考虑还是建议使用StringBuffer。

二十七、复制大量数据时,使用System.arraycopy

二十八、循环内不要不断创建对象引用

二十九、及时清除不再需要的会话

三十、不要对数组使用toString方法

上一篇 下一篇

猜你喜欢

热点阅读