一、什么是jvm字节码
无论你是一名 Java 开发者、架构师、CxO 还是智能手机的普通用户,Java 字节码都在你面前,它是 Java 虚拟机的基础。
总监、管理者和非技术人员可以放轻松点:他们所要知道的就是开发团队在正在进行下一版的开发,Java 字节码默默的在 JVM 平台上运行。
简单地说,Java 字节码是 Java 代码(如,class 文件)的中间表现形式,它在 JVM 内部执行,那么为什么你需要关心它?因为如果没有 Java 字节码,Java 程序就无法运行,因为它定义了 Java 开发者编写代码的方式。
从技术角度看,JVM 在运行时将 Java 字节码以 JIT 的编译方式将它们转换成原生代码。如果没有 Java 字节码在背后运行,JVM 就无法进行编译并映射到原生代码上。
很多 IT 的专业技术人员可能没有时间去学习汇编程序或者机器码,可以将 Java 字节码看成是某种与底层代码相似的代码。但当出问题的时候,理解 JVM 的基本运行原理对解决问题非常有帮助。
二、怎么查看jvm的字节码文件
1、首先新建项目
jvm字节码指令
2、写上类似的代码或者其他可以运行的代码
jvm字节码指令
3、利用cmd进入这类的代码目录
jvm字节码指令
4、cd到此目录使用javap命令
jvm字节码指令
这就是字节码文件

Classfile /D:/DataX/DataX-master/properties/target/classes/com/citydo/properties/test/Test.class
  Last modified 2018-10-20; size 598 bytes
  MD5 checksum 8a34b659adf9694f3c74aef1580dd4e4
  Compiled from "Test.java"
public class com.citydo.properties.test.Test
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #5.#23         // java/lang/Object."<init>":()V
   #2 = Fieldref           #24.#25        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = Methodref          #26.#27        // java/io/PrintStream.println:(I)V
   #4 = Class              #28            // com/citydo/properties/test/Test
   #5 = Class              #29            // java/lang/Object
   #6 = Utf8               <init>
   #7 = Utf8               ()V
   #8 = Utf8               Code
   #9 = Utf8               LineNumberTable
  #10 = Utf8               LocalVariableTable
  #11 = Utf8               this
  #12 = Utf8               Lcom/citydo/properties/test/Test;
  #13 = Utf8               main
  #14 = Utf8               (Ljava/lang/String;)V
  #15 = Utf8               args
  #16 = Utf8               Ljava/lang/String;
  #17 = Utf8               a
  #18 = Utf8               I
  #19 = Utf8               b
  #20 = Utf8               c
  #21 = Utf8               SourceFile
  #22 = Utf8               Test.java
  #23 = NameAndType        #6:#7          // "<init>":()V
  #24 = Class              #30            // java/lang/System
  #25 = NameAndType        #31:#32        // out:Ljava/io/PrintStream;
  #26 = Class              #33            // java/io/PrintStream
  #27 = NameAndType        #34:#35        // println:(I)V
  #28 = Utf8               com/citydo/properties/test/Test
  #29 = Utf8               java/lang/Object
  #30 = Utf8               java/lang/System
  #31 = Utf8               out
  #32 = Utf8               Ljava/io/PrintStream;
  #33 = Utf8               java/io/PrintStream
  #34 = Utf8               println
  #35 = Utf8               (I)V
{
  public com.citydo.properties.test.Test();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
	#操作数栈深度2
	#本地变量表最大长度(slot为单位) 64位是2 其他是1 如果非static方法索引0代表this 后面是入参
	# 1个参数 实例方法多一个this参数
	#jvm操作的栈指令  汇编操作寄存器指令 堆栈存在内存中 寄存器存在CPU的中央处理器中
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/citydo/properties/test/Test;

  public static void main(java.lang.String);
    descriptor: (Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=4, args_size=1
         0: iconst_2 #常量2压栈
         1: istore_1 #出栈保存到本地变量1里面
         2: iconst_3 #常量3压栈
         3: istore_2 #出栈保存到本地变量2里面
         4: iload_1  #局部变量1压栈
         5: iload_2  #局部变量2压栈
         6: iadd      #栈顶2个元素相加 计算结果压栈
         7: istore_3  #出栈保存到局部变量3里面
         8: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream; #调用打印指令
        11: iload_3
        12: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
        15: return   #返回
      LineNumberTable:
        line 5: 0
        line 6: 2
        line 7: 4
        line 8: 8
        line 9: 15
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      16     0  args   Ljava/lang/String;  #变量类型表
            2      14     1     a   I
            4      12     2     b   I
            8       8     3     c   I
}
SourceFile: "Test.java"  #名称

相关文章: