深入探索JVM垃圾回收:ARM服务器垃圾回收的挑战和优化
上QQ阅读APP看书,第一时间看更新

1.4.1 Java代码到字节码

Java代码编译成字节码由javac这个工具完成,编译后生成class文件。可以通过javap这个工具反编译字节码文件。反编译后整个文件很长,这里仅仅截取add函数和main函数相关代码片段对应的字节码。如下所示:

public class Example {
    // compiled from: Example.java
    // access flags 0x0
    add(II)I
        L0
            LINENUMBER 4 L0
            ILOAD 1
            ILOAD 2
            IADD
            IRETURN
        L1
            LOCALVARIABLE this LExample; L0 L1 0
            LOCALVARIABLE i I L0 L1 1
            LOCALVARIABLE j I L0 L1 2
            MAXSTACK = 2
            MAXLOCALS = 3
    // access flags 0x9
    public static main([Ljava/lang/String;)V throws java/lang/Exception
        L0
            LINENUMBER 9 L0
            NEW Example
            DUP
            INVOKESPECIAL Example.<init> ()V
            ASTORE 1
        L1
            LINENUMBER 11 L1
            ALOAD 1
            ICONST_1
            ICONST_3
            INVOKEVIRTUAL Example.add (II)I
            ISTORE 2
        L2
            LINENUMBER 13 L2
            RETURN
        L3
            LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
            LOCALVARIABLE obj LExample; L1 L3 1
            LOCALVARIABLE result I L2 L3 2
            MAXSTACK = 3
            MAXLOCALS = 3
}

在这个字码片段中,add函数对应一共有4个字节码指令(ILOAD l、ILOAD 2、IADD、IRETURN),JVM在执行add函数时执行的就是这4个指令。