jvm-006(張龍老師jvm教程) 常量傳播優化和字節碼指令入門

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章