1. 程式人生 > >JVM--java類檔案結構

JVM--java類檔案結構

          據說分析java類結構對日後的編碼優化有很大的幫助,同時它也是我們理解java虛擬機器類載入,記憶體分配,解析的基礎,就和小夥伴們一起探討學習了一番!

        先來張大圖做個導向:

                       

         1. 我們首先要搞明白.class檔案是咋來的,為啥要有.class檔案?

         我們知道在JDK裡面執行一個javac就能將java檔案解析成了class檔案,資料上說,程式碼編譯的結果是將本地機器碼轉為位元組碼,也就是我們的class檔案。

        我們知道JVM的作用就是計算機來執行程式,目的是做到跨平臺應用。因此它可以將多種語言編譯為位元組碼為基礎的class檔案來執行,這樣,就不必在乎作業系統和機器指令了,真正實現虛擬機器跨平臺的效果。

         2. class檔案由兩種資料型別組成,無符號數和表,它都記錄了什麼東西呢?

          

        說白了,就是記錄我們寫的java類裡面所有資訊的。魔數用來標識我是能被JVM識別的class檔案,然後記錄版本資訊,用於對JDK的識別,例如:十進位制版本號為51的class檔案為1.7版本jdk編譯。

       常量池是class檔案的資源庫,記錄所有與其他專案相關聯的資料型別,就是我所有引用資源的符號引用或者識別符號。它包括類和介面的全限定名,欄位名稱或者描述符,方法名稱或者描述符,通過jdk的javap命令可以取得這些資訊。例如執行:javap -verbose HellowWord的程式碼與常量池對比:

import java.util.Scanner;
public class HellowWord{
	public static void main(String[] args){
		String a="Hellow World";
		System.out.println(a);
	}
}
                   
        對比我們可以看出他們將編寫的java程式碼的每個單詞都用符號識別符號的形式展現出來了。

        類索引確定各個類的繼承關係;欄位表集合則用於描述類或者介面中的變數,例如作用域,例項變數還是類變數,可變性,併發可見性,可否被序列化,欄位資料型別,欄位名稱。方法表用於標識方法,屬性表用於標識屬性。

        3. 如何code屬性讀取方法?

           

        class檔案通過code屬性表,讀取屬性值,屬性長度,最大棧深度,區域性變量表儲存空間,程式碼長度,程式碼值。通過JVM位元組碼指令表將16進位制位元組碼翻譯為位元組碼指令。

                 

    總結:

        class檔案具備的平臺中立,緊湊,穩定和擴充套件的特點,是java平臺實現跨平臺,語言無關特性的重要支柱。