• 一个理解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:UsersdreamDesktopMarkdownn学习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:UsersdreamDesktopMarkdownn学习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

     

  • 相关阅读:
    MySQL No Install zip安装方法
    xaml中绑定单例属性
    wpf 绑定ObservableCollection 的Count属性
    ItemsControl 使用Grid布局
    C# 读取oracle 中文乱码的解决方案
    wpf datagrid 行双击事件
    wpf鼠标捕获与控件交互——UIElement.CaptureMouse
    Mysql备份还原
    删除_desktop.ini病毒文件
    揭露【誉思云】打码软件的诈骗骗局!誉思云是骗人的,不要再浪费钱财!
  • 原文地址:https://www.cnblogs.com/kshtrueheart/p/12596720.html
Copyright © 2020-2023  润新知