JVM优化—字节码查看

 1.通过javap命令查看class文件的字节码内容

  1.1 编写一个简单的Test类:

public static void main(String[] args) { 
  int a = 2;
  int b = 5;
  int c = b ‐ a;
  System.out.println(c);
}

  1.2 运行该类后target目录下会生成一个class文件

         

  1.3 进入target目录启动cmd命令窗口

  

  1.4 通过javap命令查看该 class文件中的字节码内容 

  1.5 查看生成的javapTest.txt文件的内容如下

  内容大致分为4个部分:
    第一部分:显示了生成这个class的java源文件、版本信息、生成时间等。
    第二部分:显示了该类中所涉及到常量池,共35个常量。
    第三部分:显示该类的构造器,编译器自动插入的。
    第四部分:显示了main方的信息。(这个是需要我们重点关注的) 
 
  2.常量池 
 

 

   2.1 方法描述符 

示例 :

  The method descriptor for the method: 

Object m(int i, double d, Thread t) {...}

  is

(IDLjava/lang/Thread;)Ljava/lang/Object;

  2.2 解读方法 字节码

  2.3 图解

 

  2.5 研究 i++与++i的不同

  2.5.1 编写代码

 public static void main(String[] args) {
        new Test01().method1();
        new Test01().method2();
    }
    public void method1(){
        int i=1;
        int a=i++;
        System.out.println(a);
    }
    public void method2(){
        int i=1;
        int a=++i;
        System.out.println(a);
    }

  2.5.2 运行该类后target中会生成class类  并找到这个class的目录

  2.5.3  从上图目录中输入cmd打开命令行窗口 并输入命令

  2.5.4 查看Test01.txt内容

  2.5.6 对比

i++:

  

 ++i:

  

  区别:

    i++

      只是在本地变量中对数字做了相加,并没有将数据压入到操作栈

      将前面拿到的数字1,再次从操作栈中拿到,压入到本地变量中 

    ++i

      将本地变量中的数字做了相加,并且将数据压入到操作栈

      将操作栈中的数据,再次压入到本地变量中 

  3. 字符串拼接

  字符串的拼接在开发过程中使用是非常频繁的,常用的方式有三种: 
      +号拼接: str+"456"
      StringBuilder拼接
      StringBuffer拼接 
 
  StringBuffer是保证线程安全的,效率是比较低的,我们更多的是使用场景是不会涉及到
线程安全的问题的,所以更多的时候会选择StringBuilder,效率会高一些
 
  那么,问题来了,StringBuilder和“+”号拼接,哪个效率高呢?接下来我们通过字节码的方式进行探究
  
  3.1 编写测试代码
 public static void main(String[] args) {
        new Test02().m1(); 
        new Test02().m2(); 
    }
    public void m1(){ 
        String s1 = "123"; 
        String s2 = "456";
        String s3 = s1 + s2; 
        System.out.println(s3);
    }
    
    public void m2(){ 
        String s1 = "123";
        String s2 = "456"; 
        StringBuilder sb = new StringBuilder(); 
        sb.append(s1); sb.append(s2);
        String s3 = sb.toString(); System.out.println(s3); 
    }

  

  3.2 运行该类后target下 生成class文件   后通过命令生成字节码文件(这些步骤略详情见上面操作)

从解字节码中可以看出,m1()方法源码中是使用+号拼接,但是在字节码中也被编译成了StringBuilder方式。
所以,可以得出结论,字符串拼接,+号和StringBuilder是相等的,效率一样。 
 
 
  
原文地址:https://www.cnblogs.com/szhhhh/p/12463021.html