zoukankan      html  css  js  c++  java
  • 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是相等的,效率一样。 
     
     
      
  • 相关阅读:
    HDU 3951 (博弈) Coin Game
    HDU 3863 (博弈) No Gambling
    HDU 3544 (不平等博弈) Alice's Game
    POJ 3225 (线段树 区间更新) Help with Intervals
    POJ 2528 (线段树 离散化) Mayor's posters
    POJ 3468 (线段树 区间增减) A Simple Problem with Integers
    HDU 1698 (线段树 区间更新) Just a Hook
    POJ (线段树) Who Gets the Most Candies?
    POJ 2828 (线段树 单点更新) Buy Tickets
    HDU 2795 (线段树 单点更新) Billboard
  • 原文地址:https://www.cnblogs.com/szhhhh/p/12463021.html
Copyright © 2011-2022 走看看