局部决定总体。

一个应用的总体性能取决于每一个组件的性能。

以下是一些帮助你提高应用性能的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
    publicObject
    pop() {
        if(size
    ==

    0
    )
            thrownew

    EmptyStackException();
     
        Object
    result = elements[--size];
        elements[size]
    =

    null
    //
    清除无用对象的引用
        returnresult;
    }
  • (不要这样)
  • 1
    2
    3
    4
    5
    publicObject
    pop(){
        if(size
    ==

    0
    )
            thrownew

    EmptyStackException();
        returnelements[--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性能小技巧的更多相关文章

  1. Java开发小技巧(三):Maven多工程依赖项目

    前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下面以多可执行Jar包项目的开发为例 ...

  2. Java编程小技巧(1)——方法传回两个对象

    原文地址:Java编程小技巧(1)--方法传回两个对象 | Stars-One的杂货小窝 题目是个伪命题,由Java语法我们都知道,方法要么返回一个对象,要么就不返回 当有这样的情况,我们需要返回两个 ...

  3. Java 性能优化技巧集锦

    摘要: =================================== 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常 ...

  4. Java性能优化技巧集锦

    一.通用篇 "通用篇"讨论的问题适合于大多数Java应用. 1.1 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的全部构造函数都会被自己主动调用.但假设 ...

  5. SAP CRM 性能小技巧

    导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...

  6. Java 性能优化技巧及实战

    关于Java代码的性能优化,是每个javaer都渴望掌握的本领,进而晋升为大牛的必经之路,但是对java的调优需要了解整个java的运行 机制及底层调用细节,需要多看多读多写多试,并非一朝一夕之功.本 ...

  7. Java性能优化技巧及实战

    关于Java代码的性能优化,是每个javaer都渴望掌握的本领,进而晋升为大牛的必经之路,但是对java的调优需要了解整个java的运行机制及底层调用细节,需要多看多读多写多试,并非一朝一夕之功.本文 ...

  8. java性能优化技巧

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1. 尽量使用final修饰符. 带有final修饰符的类是不可派生的. ...

  9. Java开发小技巧(一)

    前言 相信许多程序员在看别人写的代码的时候,会有怀疑人生的感想,面对一堆天书一样的代码,很难摸清作者的思路,最后选择了重构,如果你认同上面这个作法,说明了两个问题:要么原来的开发者技术菜.要么你技术菜 ...

随机推荐

  1. idea下载多个插件项目启动不了解决方案

    今天下载mybatis plugin插件的时候 有好多个版本的plugin,然后呢,看第二个比较热门,就下载了第二个,然后重启idea发现这个插件貌似得花钱,那算了吧,咱用第一个免费的吧,就又下载了第 ...

  2. 页面get post等查看

    原文发布时间为:2010-03-08 -- 来源于本人的百度文章 [由搬家工具导入] http://www.fiddler2.com/Fiddler2/firstrun.asp

  3. LeetCode OJ-- Valid Sudoku

    https://oj.leetcode.com/problems/valid-sudoku/ 给出数独的一部分来,验证给出的这一部分是否为 valid 行上无重复的,且是从 ‘1’ 到‘9’ 列上无重 ...

  4. visual studio 插件 resharper 使用指南

    vs虽然号称是宇宙第一ide,但在智能提示和代码分析方面还是要略逊于jetbrains系列的ide.如果将jetbrains系列ide的智能提示和代码分析集成到vs中,对vs来说无异于如虎添翼.res ...

  5. (21)python lambda表达式

    lambda表达式是一个匿名函数 通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用 最简单的例子 add = lambda x,y : x + y print add(3,5) #out ...

  6. 利用Django徒手写个静态页面生成工具

    每个Geek对折腾自己的博客都有着一份执念 背景介绍 曾经多次在不同的平台写博客,但全部都以失败而告终.去年七月选择微信公众号做为平台开始了又一次的技术分享,庆幸一直坚持到现在,但随着文章发表的越来越 ...

  7. codevs 1450 xth 的旅行

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 毕业了,Xth很高兴,因为他要和他的 ra ...

  8. spring源码学习(一)

    Spring作为一个IOC容器,今天我们学习它作为web解析的地方,学习下webmvc包的代码.我们先看下web.xml文件 可以看到通过DispatcherServlet来实现页面的mapper处理 ...

  9. PHP的按位运算符是什么意思

    按位运算符是什么意思? 按位运算符(Bitwise Operators)是用于对涉及单个位操作的位模式或二进制数字执行位操作的运算符. 按位运算符可以用于: 1.通信堆栈,其中标头中的各个位附加到数据 ...

  10. 求用delphi编写的LRC校验位算法函数,急!!!

    求用delphi编写的LRC校验位算法函数,急!!! 某命令串为":010200000001FC" 其16进制为“3A 30 31 30 32 30 30 30 30 30 30 ...