JVM一(前言)

一、前言

参考官网:https://docs.oracle.com/javase/8/

1.1:JDK组成

image.png

1.2:程序运行流程

image

1.2.1:.java文件
class Student {
    private String name = "renwei";
    private int age;
    private final double money = 100;
    private static String b;
    private final static String c = "100456mmm";
    private static Object object = new Object();
    public void fun1() {
        System.out.println("qweuiq");
    }
    public static int fun2(int i1, int i2) {
        i1 = 3;
        int i = i1 + i2;
        Object object = new Object();
        return i;
    }
    public static void main(String[] args) {
        System.out.println(fun2(2, 5));
    }
}
1.2.2:.class文件

(1):遵循规则

ClassFile {
    u4             magic;
    u2             minor_version;
    u2             major_version;
    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];
    u2             access_flags;
    u2             this_class;
    u2             super_class;
    u2             interfaces_count;
    u2             interfaces[interfaces_count];
    u2             fields_count;
    field_info     fields[fields_count];
    u2             methods_count;
    method_info    methods[methods_count];
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

说明:

  1. u4 magic; .class文件标识 (CA FE BA BE)
  2. u2 minor_version; 版本号 (00 00)
  3. u2 major_version; 版本号 (00 34)十进制的52
  4. u2 constant_pool_count; 常量池

常量池:
1 字面量:文本(字符串)、final修饰的属性;
2 符号引用:类、接口、字段、方法的描述或者表示(00 3D )十进制的61

  1. cp_info constant_pool[constant_pool_count-1]; 常量的数量 61-1=60

(2):结果
image.png

(3):反编译:

命令:javap -p -v Student.class >Student.txt
Classfile /F:/Student.class
  Last modified 2020-9-1; size 898 bytes
  MD5 checksum cf9c7479cd5b973ffa96b1bc92fee471
  Compiled from "Student.java"
class Student
  minor version: 0
  major version: 52
  flags: ACC_SUPER
Constant pool:
   #1 = Methodref          #10.#39        // java/lang/Object."<init>":()V
   #2 = String             #40            // renwei
   #3 = Fieldref           #14.#41        // Student.name:Ljava/lang/String;
   #4 = Double             100.0d
   #6 = Fieldref           #14.#42        // Student.money:D
   #7 = Fieldref           #43.#44        // java/lang/System.out:Ljava/io/PrintStream;
   #8 = String             #45            // qweuiq
   #9 = Methodref          #46.#47        // java/io/PrintStream.println:(Ljava/lang/String;)V
  #10 = Class              #48            // java/lang/Object
  #11 = Methodref          #14.#49        // Student.fun2:(II)I
  #12 = Methodref          #46.#50        // java/io/PrintStream.println:(I)V
  #13 = Fieldref           #14.#51        // Student.object:Ljava/lang/Object;
  #14 = Class              #52            // Student
  #15 = Utf8               name
  #16 = Utf8               Ljava/lang/String;
  #17 = Utf8               age
  #18 = Utf8               I
  #19 = Utf8               money
  #20 = Utf8               D
  #21 = Utf8               ConstantValue
  #22 = Utf8               b
  #23 = Utf8               c
  #24 = String             #53            // 100456mmm
  #25 = Utf8               object
  #26 = Utf8               Ljava/lang/Object;
  #27 = Utf8               <init>
  #28 = Utf8               ()V
  #29 = Utf8               Code
  #30 = Utf8               LineNumberTable
  #31 = Utf8               fun1
  #32 = Utf8               fun2
  #33 = Utf8               (II)I
  #34 = Utf8               main
  #35 = Utf8               ([Ljava/lang/String;)V
  #36 = Utf8               <clinit>
  #37 = Utf8               SourceFile
  #38 = Utf8               Student.java
  #39 = NameAndType        #27:#28        // "<init>":()V
  #40 = Utf8               renwei
  #41 = NameAndType        #15:#16        // name:Ljava/lang/String;
  #42 = NameAndType        #19:#20        // money:D
  #43 = Class              #54            // java/lang/System
  #44 = NameAndType        #55:#56        // out:Ljava/io/PrintStream;
  #45 = Utf8               qweuiq
  #46 = Class              #57            // java/io/PrintStream
  #47 = NameAndType        #58:#59        // println:(Ljava/lang/String;)V
  #48 = Utf8               java/lang/Object
  #49 = NameAndType        #32:#33        // fun2:(II)I
  #50 = NameAndType        #58:#60        // println:(I)V
  #51 = NameAndType        #25:#26        // object:Ljava/lang/Object;
  #52 = Utf8               Student
  #53 = Utf8               100456mmm
  #54 = Utf8               java/lang/System
  #55 = Utf8               out
  #56 = Utf8               Ljava/io/PrintStream;
  #57 = Utf8               java/io/PrintStream
  #58 = Utf8               println
  #59 = Utf8               (Ljava/lang/String;)V
  #60 = Utf8               (I)V
{
  private java.lang.String name;
    descriptor: Ljava/lang/String;
    flags: ACC_PRIVATE

  private int age;
    descriptor: I
    flags: ACC_PRIVATE

  private final double money;
    descriptor: D
    flags: ACC_PRIVATE, ACC_FINAL
    ConstantValue: double 100.0d

  private static java.lang.String b;
    descriptor: Ljava/lang/String;
    flags: ACC_PRIVATE, ACC_STATIC

  private static final java.lang.String c;
    descriptor: Ljava/lang/String;
    flags: ACC_PRIVATE, ACC_STATIC, ACC_FINAL
    ConstantValue: String 100456mmm

  private static java.lang.Object object;
    descriptor: Ljava/lang/Object;
    flags: ACC_PRIVATE, ACC_STATIC

  Student();
    descriptor: ()V
    flags:
    Code:
      stack=3, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: aload_0
         5: ldc           #2                  // String renwei
         7: putfield      #3                  // Field name:Ljava/lang/String;
        10: aload_0
        11: ldc2_w        #4                  // double 100.0d
        14: putfield      #6                  // Field money:D
        17: return
      LineNumberTable:
        line 1: 0
        line 2: 4
        line 4: 10

  public void fun1();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: ldc           #8                  // String qweuiq
         5: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
         8: return
      LineNumberTable:
        line 10: 0
        line 11: 8

  public static int fun2(int, int);
    descriptor: (II)I
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=4, args_size=2
         0: iconst_3
         1: istore_0
         2: iload_0
         3: iload_1
         4: iadd
         5: istore_2
         6: new           #10                 // class java/lang/Object
         9: dup
        10: invokespecial #1                  // Method java/lang/Object."<init>":()V
        13: astore_3
        14: iload_2
        15: ireturn
      LineNumberTable:
        line 14: 0
        line 15: 2
        line 16: 6
        line 17: 14

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=3, locals=1, args_size=1
         0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
         3: iconst_2
         4: iconst_5
         5: invokestatic  #11                 // Method fun2:(II)I
         8: invokevirtual #12                 // Method java/io/PrintStream.println:(I)V
        11: return
      LineNumberTable:
        line 21: 0
        line 22: 11

  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=2, locals=0, args_size=0
         0: new           #10                 // class java/lang/Object
         3: dup
         4: invokespecial #1                  // Method java/lang/Object."<init>":()V
         7: putstatic     #13                 // Field object:Ljava/lang/Object;
        10: return
      LineNumberTable:
        line 7: 0
}
SourceFile: "Student.java"

说明:
跟上面(1)的说明吻合

  1. 1.class Student
    minor version: 0
    major version: 52 52
    flags: ACC_SUPER
  2. Constant pool: 60个.....

注:#1 = Methodref #10.#39 // java/lang/Object."<init>":()V 每个类都是object类的子类,所以每个类第一行都是object类的初始化指令

具体了解:https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.4


少年卫O6Vz4
1 声望0 粉丝