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是相等的,效率一样。 
     
     
      
  • 相关阅读:
    Java Logging: Log Levels
    Java Logging: Logger Hierarchy
    Java Logging: Logger
    Java Logging: Basic Usage
    Use final liberally
    Writing Final Classes and Methods
    Java Logging: Overview
    base Tag
    DOM Nodes
    Browser environment
  • 原文地址:https://www.cnblogs.com/szhhhh/p/12463021.html
Copyright © 2011-2022 走看看