jvm-006
一、常量傳播優化:
常量在編譯階段,如果能確定其數值,會存入到調用類的常量池中。在運行階段,調用類和常量定義的類就沒有任何關係了(可以將定義類的.class文件刪除嘗試,也不會報錯)。因此,常量的調用不會引起定義類的初始化。
實例代碼:
public class TestCode01 {
public static void main(String[] args) {
System.out.println(Poo.a);
}
}
class Poo {
public static final String a = "hello";
static {
System.out.println("靜態代碼塊");
}
}
輸出結果:
hello
TestCode01調用了Poo類的常量a,並不會引起Poo類的初始化(靜態代碼塊沒有執行)。
二、字節碼指令:
反編譯查看以上class文件的輸入:
執行:javap -c TestCode01.class
Compiled from "TestCode01.java"
public class cn.com.ccxi.test.jvm.TestCode01 {
public cn.com.ccxi.test.jvm.TestCode01();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #22 // String hello
5: invokevirtual #24 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
1、ldc表示:將int型、float型或String型常量值從常量池推送至棧頂。
2、bipush表示:將單字節(byte:-128 ~ 127)的數值從常量池推送至棧頂。
3、sipush表示:將短字節(short:-32768 ~ 32767)的數值從常量池推送至棧頂。
4、icons_1表示:將int型數值1推送至棧頂,類似的還有:icons_2,icons_3,icons_4,icons_5,icons_0,icons_m1(表示-1)