`
方XiRui
  • 浏览: 18833 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java性能小技巧

    博客分类:
  • JAVA
阅读更多

英文原文:xmlandmore,编译:ImportNew - 朱伟杰

局部决定整体。一个应用的整体性能取决于每个组件的性能。下面是一些帮助你提高应用性能的Java编程技巧:

编程技巧 原因及策略
避免重复创建对象 为什么:

 

  • 更少的对象会需要更少的垃圾回收
  • 使用的空间越少,应用的性能越好

怎么做:

  • 重复利用一个对象,而不是在每次需要的时候都去创建一个功能一样的对象
  • (这样做)
  • String s = “No longer silly”;
  • (不要这样)
  • String s = new String(“silly”);
  • 不可变类中既提供构造函数,又提供了静态工厂方法的,优先考虑使用静态工厂方法。
  • 复用那些一旦初始化(使用静态初始化)就不会改变的对象
避免循环引用 为什么:

 

  • 一组相互引用的对象,如果他们没有被其他对象直接引用的话,它们会变得不可达,这样会导致它们一直都保留在内存里。

怎么做:

  • 你可以使用强引用来表示“父到子“的引用关系,使用弱引用来表示“子到父”的引用关系。
使用==操作符来替代equals(Object)方法 为什么:

 

  • ==操作符的性能更好
  • 例如,对于字符串比较,equals()方法会去比较字符串对象里的字符。==操作符会比较两个对象的引用,来比较它们是否指向同一个实例。

怎么做:

  • 当且仅当a == b 的时候才会有a.equals(b)
  • 例如,对于重复调用的地方,使用静态工厂方法来返回相同的对象。
清除无用的对象的引用 为什么:

 

  • 无用的对象引用会导致更多的垃圾回收动作,从而降低性能
  • 无用的对象引用会导致更多的内存占用,从而降低性能

怎么做:

  • 如果一个引用时废弃的话,把它设置为null
  • (这样做)
  • 1
    2
    3
    4
    5
    6
    7
    8
    public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
     
        Object result = elements[--size];
        elements[size] = null // 清除无用对象的引用
        return result;
    }
  • (不要这样)
  • 1
    2
    3
    4
    5
    public Object pop(){
        if (size == 0)
            throw new EmptyStackException();
        return elements[--size];
    }
避免使用finalizer 为什么:

 

  • 垃圾回收器需要单独记录等待终结的对象
  • 调用finalize方法也有一定的开销
  • Finalizer是不安全的,因为它有可能会复活一个对象,这样会干扰垃圾回收。
避免使用引用对象 为什么:

 

  • 和finalizer一样,垃圾回收器需要特别处理软引用、弱引用以及幽灵引用。
  • 尽管引用对象在某些方面很有作用,例如,简化cache的实现,但是大量引用对象的存在会使得垃圾回收运行缓慢。
  • 记录一个引用对象的开销远远超过一个普通对象(强引用)的开销
避免使用对象池 为什么:

 

  • 对象池不仅会使得更多的数据对象保持活动,同时会使得对象的存活时间延长
  • 值得注意的是,大量存活的数据对象的处理是GC的瓶颈,GC被优化成适合于处理许多寿命较短的对象
  • 并且,创建新的对象而不是保持旧的对象存活,会对缓存的局部性有益
  • 不过,在一个包含大量大对象的环境下,例如大的数组,性能或许会因为使用对象池而有所提升。
选择好的算法和数据结构 为什么:

 

  • 考虑一下通过链表来实现队列的场景
  • 即使你的程序不需要遍历整个链表,但是垃圾回收器还是需要这样做的。
  • 如果元素的封装者没有把元素没有把元素放在内存中邻近的位置,这样会破坏缓存局部性。因而会导致程序长时间的暂停,尤其是对象的指针分散在一个很大的堆区时,垃圾回收器会在标记阶段追随指针的时候频繁遭遇缓存失效。
避免使用System.gc 为什么:

 

  • Java语言规范里没有保证调用System.gc会做什么事情。如果它规定了的话,或许会超出你的期望,也或许每次调用都做不同的事情。
避免使用太多的线程 为什么:

 

  • 进程上下文切换的次数会随着要调度的进程的数目相应地增长,这样会对性能有隐性的影响。
  • 例如,Intel A-64处理器上的本地线程上下文的大小大概是几千KB
避免使用竞争锁 为什么:

 

  • 竞争锁一般都是程序的瓶颈,因为它的出现意味着多个线程想访问同一个资源或者执行同一段代码。
避免不需要的异常 为什么:

 

  • 异常处理会占用一定的事件,并且会打断程序的正常执行流程。
  • 作者曾经遇到这样一场景,在客户的应用里,一个正常的执行流程每秒会抛出成千上万的NullPointerException。这个错误被纠正后,应用的性能里面有了一个数量级的提升。
避免使用大对象

为什么:

  • 大对象有时候需要直接在堆而不是在线程本地存储区(thread local areas, TLA)进行内存分配。
  • 大对象直接在堆上分配是有坏处的,因为它会更快地产生内存碎片。
  • 在虚拟机(例如JRockit)上分配大对象会降低性能,因为分配内存的时候会使用堆的全局锁。
  • 过度使用大对象会造成频繁的全栈压缩,这样做是具有破坏性的,而且这样会导致导致所有的线程暂停很长一段时间。

 

参考书籍

  1. Oracle JRockit
  2. Effective Java by Joshua Bloch

 

英文原文:xmlandmore,编译:ImportNew - 朱伟杰

译文链接:http://www.importnew.com/1531.html

分享到:
评论

相关推荐

    阿里巴巴Java性能调优实战(2021-2022华山版)+Java架构核心宝典+性能优化手册100技巧.rar

    性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...

    Java性能优化手册100技巧 中文PDF最新版

    性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...

    提高java代码性能各种技巧

    非常详细的代码性能提高技巧介绍总结,使代码更清晰明了!

    Java性能优化实战21 讲 视频课程-网盘链接提取码下载 .txt

    对 Java 工程师而言,性能优化能力决定了你能否进入大厂或成为一名高级工程师。但性能优化的能力却极难提升,如果你缺乏正确的方法论和实战演练,则很容易事倍功半。 视频大小:1.2G

    优化Java堆内存大小的五个技巧

    GCJava性能调优JVMHeapJava编程语言 摘要:Java堆容量不足可以对性能造成很大影响,这样无疑就给程序带来不可必要的麻烦,本文总结了影响Java堆容量不足的五大原因以及巧妙地去优化? 本文作者Pierre是一名有10...

    java面试题目与技巧1

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java面试题及技巧4

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    java面试题以及技巧

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    JAVA上百实例源码以及开源项目源代码

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    JAVA上百实例源码以及开源项目

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包4

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    Android开发技巧与性能优化

    3.JAVA 开发小技巧 4.ANDROID 最佳实践 4.1 为性能设计: 4.2 为响应灵敏性设计 4.3 为无缝设计: 5. 多资源文件的引用 6. ANDROID 调试 LOGCAT 技巧 7. 用 ANDROID 运行最简单的C 程序 8. 开发技巧杂集 8.1 一些...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java面试题及技巧3

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    java面试题以及技巧6

    │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐).pdf │ MIME简介.txt │ SCJP试题详解.pdf │ SQL面试题_心灵深处.htm │ Struts+...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题74:sql语句优化小技巧.mp4 │ Java面试题75:批量插入几百万条数据.mp4 │ Java面试题76:有没有使用过redis.mp4 │ Java面试题77:redis的使用场景.mp4 │ Java面试题78:redis存储对象的方式.mp4 │...

    Java程序员编程性能优化必备的34个小技巧(总结)

    主要介绍了Java程序员编程性能优化必备的34个小技巧(总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java基础知识点总结.docx

    无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的进步!!Java学习更是如此,知识点总结目录如下: 目录 一、 Java概述 3 二、 Java语法基础 5 ...Java 性能优化 362

Global site tag (gtag.js) - Google Analytics