美文网首页
Java性能的优化细节

Java性能的优化细节

作者: Liuzhoulin | 来源:发表于2020-09-03 11:29 被阅读0次

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

        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方法

    相关文章

      网友评论

          本文标题:Java性能的优化细节

          本文链接:https://www.haomeiwen.com/subject/ivpisktx.html