`

java深度-----effective java

    博客分类:
  • J2SE
阅读更多
高性能java

1.开发高性能java程序的原则与方法
 优化程序代码的注意事项:
 1。除非必须优化,否则不要轻易改动
 2。改动之后要进行仔细的测试
 3。在各个JVM产品中是不存在一劳永逸的成本模型
 (在某个虚拟机上做的优化效果非常好,但是到了别的虚拟机上就不一定重现了)

2。先把焦点放在设计,数据结构和算法上

每一个方法不应该长,可以方法里面引入方法,这样jit所做的工作就会少

1。使用StringBuffer来做拼接
因为如果用String,那么很多对象将在Eden区域产生,很可能在此时造成垃圾全收集的产生
StringBuffer b = new StringBuffer("a"); //这里只产生一个对象,因为他会把a这个二进
制的东西(注意这时还不是一个对象),加到b这个对象里面,所以只有一个对象。
注意:"a"有两种身份,第一种身份是对象,第二种身份是和int这中东西一样的基础类型
所以使用StringBuffer来操作字符串拼接,那么从始至终都只有一个对象哈,虽然在传值给
append的时候传递了"a"这种东西,但是这个时候他不是一个对象


2。javap -c Test 可以生成字节码文件
通过字节码我们知道加入同步控制会导致字节码指令体积会增加
同步方法获取的是对象锁

Class Test{
   public synchronized void m1(){
   }
    public synchronized void m2(){
   }
    public synchronized void m3(){
   }
    public synchronized void m4(){
   }
} 
//注意啦,这四个方法居然用了同一把锁,就是这个对象锁(this),
那么第一:四个方法只能由一个方法在一个时间内使用
第二:如果方法里面有全局变量,对象所还没有用,因为别的线程很可能
new一个自己的对象,还是可以进入这个方法来
所以千万不要使用方法同步
我们一般用字节数组作为锁变量

class Test{
  private byte[] lock1 = new byte[0];  //技巧哈
  private byte[] lock2 = new byte[0];
  
  public void m1(){
    synchronized(lock1){
      //======================
    }
  }
}

尽量使用stack变量和基本类型完成必要的任务
一个方法的局部变量会存放在这个方法的运行时栈当中
stackAccess方法性能要高于staticAccess以及instacevarAccess
staticAccess和instacevarAccess方法的性能大体一致,因为他们都是从常量池中去得到实例变量
所以尽可能的使用局部变量
class StackVar{
  private int instvar;
  private static int staticvar;
  
  void stackAccess(int val){
     int j=0;
     for(int i=0;i<val;i++){
       j +=1;     //这是对局部变量++
     }
  }
  
  void instacevarAccess(int val){
  //每次都要访问常量池,性能有问题,第二并发有问题
     for(int i=0;i<val;i++){
        instvar += 1;       //这是对实例变量++
     }
  }
  
  void instacevarAccessPer(int val){
     int j= instvar;
     for(int i=0;i<val;i++){
       j+=1;
     }
     instvar = j;
  }
  
  void staticAccess(int val){
     for(int i=0;i<val;i++){
        staticvar += 1;     //对静态变量++
     }
  }
  
  void staticAccessPer(int val){
  //性能不错,只需要访问两次常量池,
  //其他操作都是在本地栈中完成的
     int j=staticvar;
     for(int i=0;i<val;i++){
        j+=1;                  //对局部变量++然后赋值给静态变量
     }
     staticvar = j;
  }
}

使用static final private 函数以促成inlining
内联函数会使用函数的代码来替换函数的调用,将函数的代码原封不动的
拷贝到调用处,省去了函数调用的消耗,以促使性能的提升,但是如果你将一个
函数声明为static final private那么java编译器就会把这种函数作为inlining
的候选者,为什么是候选者呢?因为如果你的函数写的非常大的话,那么他会使得你函数的体积
发生激增,所以Java编译器会先看下代码的长度,代码太长他也不会把他变为内陆函数的

实例变量初始化一次就好
如果你new一个类,那么java虚拟机如何对他初始化
1。在堆中分配内存
2。对实例变量进行缺省值的初始化
3。执行构造方法的赋值动作

但是如果我们private int count=1;这么搞则有四步
1。在堆中分配内存
2。对实例变量进行缺省值的初始化
3。覆盖缺省值
4。执行构造方法的赋值动作

或者有初始化区段,比如static{}
那么
1。在堆中分配内存
2。对实例变量进行缺省值的初始化
3。初始化区段---这个虽然是static的,但确是在实例变量缺省值初始化之后
4。执行构造方法的赋值动作
class Foo{
   private int count;  //private int count=1;这样也会被执行两次,先执行缺省值赋值,
   private boolean done;
   private Point pt;
   private Vector ver;
   public Foo(){
     count = 0;  //这个东西被初始化了两次哈
     done = false; //他的缺省值本来就是false,他又初始化一次
     pt = new Point(0,0);
     vec = new Vector(10);
   }
}

class Foo{
   private int count;
   private boolean done;
   private Point pt;
   private Vector ver;
   public Foo(){
     pt = new Point(0,0);
     vec = new Vector(10);
   }
}

集群类对象的处理
1.数组,HashTable,Vector,Stack等数据结构类用于容纳和处理对象
注意:Collection类里面放的都是对象哈。。简单类型也会自动转型才被放入
1。权衡使用迭代器:Iterator,ListIterator,Enumeration
class AccessCollection{
  public int enumCec(Vector vec){  //比较快,比后面的快10%
     Enumeration enum = ver.elements();
     int toral = 0;
     while(enum.hasMoreElements()){  //在这里访问了一次容器,就比forVec慢了
       	total = ((Integer))(enum.nextElement()).iniValue();
     }
     return total;
  }
  
  public int iterVec(Vector vec){  
    Iterator it = vec.iterator();
    int total = 0;
    while(it.hasNext()){
      total +=((Integer))(it.next()).iniValue();
    }
    return total;
  }
  
  public int listiterVec(Vector vec){
     ListIterator it = vec.listIterator();
     int total = 0;
     while(it.hasNext()){
       total +=((Integer))(it.next()).iniValue();
     }
     return total;
  }
  
  public int forVec(Vector vec){//最快,比前三个方法快35%
    int size = vec.size();
    int total = 0;
    for(int i=0;i<size;i++){
      total +=((Integer)vec.get()).intValue();
    }
    
  }
}

如何复制数组元素:
使用循环复制;---不好
使用System.arraycopy()方法---好,比循环复制快两倍,
因为他采用操作系统底层的复制,而不是采用循环的方式
System.arraycopy(src,0,des,0,src.length);
从原数组第0个元素开始拷贝,拷贝的长度为src.length;
把他拷贝到des时,以第0个位置作为起始元素

优先数组,然后考虑群积类,尤其是在性能优先的需求中;
如果需要群集类功能,但又不考虑同步,可以先选择非同步的集群类如ArrayList;
如果需要集群类功能,又要顾及到数据同步保护时,可以选择同步集群类,如Vector;
如果选择集群类,要分清集群类使用的目的

注意:不要因为有个个数无法确定的数据需要存储,就毫无选择的使用集群类,出现这种情况可以考虑创建一个足以
容纳大量数据的array,这可能造成内存浪费,但是在性能上往往会获得更大的收益


分享到:
评论

相关推荐

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    以上只是《Effective Java》一书的部分主题,全书涵盖了大量Java编程的最佳实践和深度解析,是每个Java开发者案头必备的参考书。通过理解和应用这些知识点,开发者能够提升代码质量,降低维护成本,同时也能更好地...

    Effective Enterprise Java

    《Effective Enterprise Java》是一本深度探讨企业级Java应用开发的经典著作。这本书主要针对J2EE(Java 2 Platform, Enterprise Edition)平台,旨在提供一系列实用的编程指导和最佳实践,帮助开发者编写出高效、...

    百度地图开发java源码-tools:工具

    “推荐书籍”可能涵盖计算机科学和软件工程的经典著作,例如《 Effective Java》、《Clean Code》等,这些书籍对于提升编程技能和理解最佳实践至关重要。 “热修复”是一种在不重启应用的情况下修复程序错误的技术...

    effective enterprise java

    《Effective Enterprise Java》是一本深度探讨企业级Java开发实践的权威教材。这本书旨在帮助开发者提升在企业级Java应用开发中的效率和代码质量,通过一系列经过验证的编程实践和设计原则,提供了一套实用的指导...

    Java专业人士必备的书籍和网站列表:

    1. **《Effective Java》(第三版)** - Joshua Bloch著。这本书是Java领域的经典之作,深入讲解了Java编程的最佳实践,包括设计模式、代码优化、性能调优等,是每个Java开发者书架上的必备之选。 2. **《Java并发...

    Java工程师新人入门书籍推荐

    - 《Effective Java 中文版》:优化编码风格,提高代码质量。 - 《Java解惑》:解答Java中的疑难问题,增进对语言特性的理解。 - 《分布式Java应用:基础与实践》:淘宝架构师的经验分享,对分布式系统有深入阐述...

    Java解惑 清晰版带书签

    该书由《Effective Java》的作者所著,因此我们可以推断出这本书将包含许多实用的Java编程技巧、最佳实践以及对Java语言特性的深度解析。接下来我们将从几个方面对这本书可能涵盖的关键知识点进行概述。 ### 1. ...

    自学java看什么书-强力推荐15本必看书籍-华清远见.docx

    6. **《Thinking in Java》**(Bruce Eckel):这是一本深度讲解Java的经典之作,不仅讲解语言本身,还涵盖了数据结构、算法和设计模式等多个方面。 7. **《Effective Java》**(Joshua Bloch):本书提供了许多...

    java面试题(整理)

    这个问题旨在了解求职者对于Java学习的态度和深度。常见的Java学习书籍包括但不限于: - 《Java核心技术》 - 《Effective Java》 - 《Thinking in Java》 - 《Java编程思想》 - 《Java并发编程实战》 2. **...

    Practical Java(简体中文)

    市场上的Java书籍众多,但能够聚焦于特定主题,以独立条款形式进行深度探讨的书籍却相对较少。《Practical Java》和《Effective Java》正是这样两部著作,它们对Java的重要而基础的技术细节进行了详尽、深刻的介绍和...

    Effective.Enterprise.Java.中文版PDF和TXT下载

    《Effective Enterprise Java》是一本备受推崇的编程指南,专注于提高Java在企业级应用中的效率和质量。这本书由著名软件工程师撰写,旨在帮助开发者理解和掌握Java平台的核心特性,并提供了一套实用的编程准则和...

    Effective.Enterprise.Java.Chinese.eBook.CN

    《Effective Enterprise Java》是一本深度探讨企业级Java开发实践的权威书籍,中文版名为《Effective.Enterprise.Java.Chinese.eBook.CN》。这本书由多位经验丰富的Java开发者共同编写,旨在帮助程序员提高Java在...

    Effactive java(english pdf)

    《Effective Java》是Java开发领域的一本经典著作,...这些仅是《Effective Java》中众多知识点的冰山一角,书中还涵盖了更多关于设计模式、多线程、集合框架、序列化等方面的深度讨论,对提升Java编程技能非常有帮助。

    java进阶之路 。。

    - **书籍选择**:选择一本或多本经典且更新及时的Java教材,如《Effective Java》、《Java Concurrency in Practice》等,它们能提供深度的专业知识。 - **在线资源**:利用互联网上的免费资源,如官方文档、Stack ...

    Java 专业人士必备的书籍和网站列表

    对于进阶者,《Effective Java》由Joshua Bloch编写,是提升编程技巧的必备读物,书中涵盖了许多最佳实践和陷阱。《Java Concurrency in Practice》则深入解析了多线程和并发编程,是理解Java并发机制的权威指南。...

    EPI-in-Java:Java版本中的EPI解决方案

    EPI,全称《Effective Programming: Considerations for Modern Software》,是一本关于软件开发实践的书籍,其中涵盖了大量用于提升编程技能的实例。将EPI的解决方案转化为Java语言,对于Java程序员来说,是提高...

Global site tag (gtag.js) - Google Analytics