一个理解JVM的例子

新建一个Java程序: "ForEachDemo.java"

 import java.util.*;
 public class ForEachDemo{
  public static void main(String[] args){
  List<String> data = new ArrayList<>();
  data.add("a");
  data.add("b");
  for(String str : data){
  System.out.println(str);
  }
  }
 }

使用javac编译

 javac ForEachDemo.java

编译后生成class文件: "ForEachDemo.class"

(生成的class文件实际就是Java bytecode)

使用javap反汇编class文件

 javap -c ForEachDemo

反汇编结果:

 C:\Users\dream\Desktop\Markdownn学习\Java基础\JVM>javap -c ForEachDemo
 Compiled from "ForEachDemo.java"
 public class ForEachDemo {
  public ForEachDemo();
    Code:
        0: aload_0
        1: invokespecial #1                 // Method java/lang/Object."<init>":()V
        4: return
 
  public static void main(java.lang.String[]);
    Code:
        0: new           #2                 // class java/util/ArrayList
        3: dup
        4: invokespecial #3                 // Method java/util/ArrayList."<init>":()V
        7: astore_1
        8: aload_1
        9: ldc           #4                 // String a
       11: invokeinterface #5, 2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
       16: pop
       17: aload_1
       18: ldc           #6                 // String b
       20: invokeinterface #5, 2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
       25: pop
       26: aload_1
       27: invokeinterface #7, 1           // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
       32: astore_2
       33: aload_2
       34: invokeinterface #8, 1           // InterfaceMethod java/util/Iterator.hasNext:()Z
       39: ifeq          62
       42: aload_2
       43: invokeinterface #9, 1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
       48: checkcast     #10                 // class java/lang/String
       51: astore_3
       52: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
       55: aload_3
       56: invokevirtual #12                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       59: goto          33
       62: return
 }

结果分析

 C:\Users\dream\Desktop\Markdownn学习\Java基础\JVM>javap -c ForEachDemo
 Compiled from "ForEachDemo.java"
 public class ForEachDemo {
  public ForEachDemo();
    Code:
        0: aload_0 #从本地变量0中加载一个对象引用到堆内存(这里的对象引用就是java.lang.Object)
        1: invokespecial #1                 // Method java/lang/Object."<init>":()V
        #invokespecial 表示调用引用对象的一个实例方法(这里的方法就是java.lang.Object的init方法)
        4: return #从方法返回空
 
  public static void main(java.lang.String[]);
    Code:
        0: new           #2                 // class java/util/ArrayList
        #new 表示创建一个指定类的新实体(这里就是java.util.ArrayList类的新实体)
        3: dup #把值复制到堆内存顶部
        4: invokespecial #3                 // Method java/util/ArrayList."<init>":()V
        7: astore_1 #将一个引用保存到本地变量1
        8: aload_1 #从本地变量1中加载一个对象引用到堆内存
        9: ldc           #4                 // String a
        #ldc 表示从常量池中把一个常量的索引放到堆内存(这里的常量就是String a)
       11: invokeinterface #5, 2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
       16: pop #返回堆内存顶部的值(该值就是String a)
       17: aload_1
       18: ldc           #6                 // String b
       20: invokeinterface #5, 2           // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
       25: pop
       26: aload_1
       27: invokeinterface #7, 1           // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
       32: astore_2
       33: aload_2
       34: invokeinterface #8, 1           // InterfaceMethod java/util/Iterator.hasNext:()Z
       39: ifeq          62 #如果值是0,跳转到62处的指令
       42: aload_2
       43: invokeinterface #9, 1           // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
       48: checkcast     #10                 // class java/lang/String
       51: astore_3
       52: getstatic     #11                 // Field java/lang/System.out:Ljava/io/PrintStream;
       55: aload_3
       56: invokevirtual #12                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       59: goto          33
       62: return
 }

(”aload_0“,invokespecial”,..etc)就是Java bytecode指令

在维基百科上可以查看所有的Java bytecode指令列表,该列表包含了所有指令:

Java bytecode instruction listings

 

posted @ 2020-03-30 09:53  海纳分享  阅读(250)  评论(0编辑  收藏  举报