java-jvm虛拟機原理課件
java虛拟機原理介紹 目錄 Java虛拟機 1.java虛拟機的生命周期 2.java虛拟機的體系結構 Java class檔案 1.magic(魔數) 2.minor_version和major_version 3.constant_pool_count和constant_pool 類型的生命周期 1.類型的裝載、連接配接和初始化 2.對象的生命周期 3.解除安裝類型 連接配接模型 動态連接配接和解析 垃圾收集 Java虛拟機生命周期 每運作一個java程式,便得到JAVA虛拟機的執行個體 每個Java程式都運作于它自己的Java虛拟機執行個體中 當程式關閉退出,這個虛拟機執行個體也就随之消亡 程式本身也能夠通過調用Runtime類或者System類的exit()方法退出。? Java虛拟機體系結構 在Java假虛拟機規範中,一個虛拟機執行個體的行為時分别按照子系統、記憶體區、資料類型以及指令這幾個術語來描述的。這些組成部分一起展示了抽象的虛拟機的内部抽象體系結構。? 1)所有的線程都共享方法區,方法區必須被設計為線程安全的,方法區大小不固定 2)方法區 存儲以下類型資訊: 類的全限定名 超類的全限定名 是接口還是類 類的通路修飾修飾符 該類的【常量池】 字段資訊 方法資訊 類(靜态)變量 :類變量是由所有類執行個體共享的,即使沒有類執行個體,也可以通路 一個到類ClassLoader引用 一個到類的引用 3)方法表 運作時資料區--Java中的棧 每啟動一個新的線程,java虛拟機都會為它配置設定一個java棧,java棧上的都是此線程私有的 每當啟用一個線程時,JVM就為他配置設定一個Java棧,棧是以幀為機關儲存目前線程的運作狀态。【目前方法,目前幀,目前類,目前常量池】 每當線程調用一個Java方法時,JVM就會在該線程對應的棧中壓入一個幀,這個幀自然就成了目前幀。當執行這個方法時,它使用這個幀來存儲參數、局部變量、中間運算結果等等。 Java棧上的所有資料都是私有的。任何線程都不能通路另一個線程的棧資料。 Java棧和幀在記憶體中也不必是連續的,幀可以分布在連續的棧裡,也可以分布在堆裡 棧幀 棧幀由三部分組成:局部變量區、操作數棧和幀資料區 Java 的class檔案 Class檔案的内容 在class檔案中,可變長度項的大小和長度位于其實際資料之前,這個特性使得class檔案資料流可以被順序解析,首先讀出項的大小,然後讀出項資料 1.magic(魔數) 4個位元組 2.minor_version和major_version 4個位元組 3.constant_pool_count 和 constant_pool 4.access_flags 2個位元組 5.this_class 2個位元組 6.super_class 2個位元組 7.interfaces_count 和interfaces 8.fields_count 和 fields 9.methods_count 和 fields 10.attributes_count 和 attributes Java代碼編譯和執行的整個過程包含了以下三個重要的機制: 1.Java源碼編譯機制 2.類加載機制 3.類執行機制 Java代碼編譯是由Java源碼編譯器來完成,流程圖如下所示: Java位元組碼的執行是由JVM執行引擎來完成,流程圖如下所示: class檔案由以下部分組成: 1.結構資訊 包括class檔案格式版本号及各部分的數量與大小的資訊 2.中繼資料 對應于Java源碼中聲明與常量的資訊。包含類/繼承的超類/實作的接口的聲明資訊、域與方法聲明資訊和常量池 3.方法資訊。 對應Java源碼中語句和表達式對應的資訊。包含位元組碼、 異常處理器表、求值棧與局部變量區大小、求值棧的類型記錄、調試符号資訊 Java中的類加載機制 JVM的類加載是通過ClassLoader及其子類來完成的,類的層次關系和加載順序可以由下圖來描述: Bootstrap ClassLoader /啟動類加載器 $JAVA_HOME中jre/lib/rt.jar裡所有的class,由C++實作,不是ClassLoader子類 Extension ClassLoader/