java-jvm虛擬機原理.ppt_第1頁
java-jvm虛擬機原理.ppt_第2頁
java-jvm虛擬機原理.ppt_第3頁
java-jvm虛擬機原理.ppt_第4頁
java-jvm虛擬機原理.ppt_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

java虛擬機原理介紹 目錄 Java虛擬機1 java虛擬機的生命周期2 java虛擬機的體系結(jié)構(gòu)Javaclass文件1 magic 魔數(shù) 2 minor version和major version3 constant pool count和constant pool 類型的生命周期1 類型的裝載 連接和初始化2 對象的生命周期3 卸載類型連接模型動態(tài)連接和解析垃圾收集 Java虛擬機生命周期 每運行一個java程序 便得到JAVA虛擬機的實例每個Java程序都運行于它自己的Java虛擬機實例中當程序關(guān)閉退出 這個虛擬機實例也就隨之消亡程序本身也能夠通過調(diào)用Runtime類或者System類的exit 方法退出 Java虛擬機體系結(jié)構(gòu) 在Java假虛擬機規(guī)范中 一個虛擬機實例的行為時分別按照子系統(tǒng) 內(nèi)存區(qū) 數(shù)據(jù)類型以及指令這幾個術(shù)語來描述的 這些組成部分一起展示了抽象的虛擬機的內(nèi)部抽象體系結(jié)構(gòu) 1 所有的線程都共享方法區(qū) 方法區(qū)必須被設(shè)計為線程安全的 方法區(qū)大小不固定2 方法區(qū)存儲以下類型信息 類的全限定名超類的全限定名是接口還是類類的訪問修飾修飾符該類的 常量池 字段信息方法信息類 靜態(tài) 變量 類變量是由所有類實例共享的 即使沒有類實例 也可以訪問一個到類ClassLoader引用一個到類的引用3 方法表 運行時數(shù)據(jù)區(qū) 方法區(qū) 堆1 同一個java應(yīng)用所有的線程共享堆空間 由于每一個java程序獨占一個java虛擬機實例 因面每個java程序都有它自己的堆空間 堆空間可以分為三部分 一個Eden區(qū) Survivor區(qū)和truned區(qū)2 由new操作符創(chuàng)建的對象均位于堆中 運行時數(shù)據(jù)區(qū) java中的堆 運行時數(shù)據(jù)區(qū) Java中的棧 每啟動一個新的線程 java虛擬機都會為它分配一個java棧 java棧上的都是此線程私有的每當啟用一個線程時 JVM就為他分配一個Java棧 棧是以幀為單位保存當前線程的運行狀態(tài) 當前方法 當前幀 當前類 當前常量池 每當線程調(diào)用一個Java方法時 JVM就會在該線程對應(yīng)的棧中壓入一個幀 這個幀自然就成了當前幀 當執(zhí)行這個方法時 它使用這個幀來存儲參數(shù) 局部變量 中間運算結(jié)果等等 Java棧上的所有數(shù)據(jù)都是私有的 任何線程都不能訪問另一個線程的棧數(shù)據(jù) Java棧和幀在內(nèi)存中也不必是連續(xù)的 幀可以分布在連續(xù)的棧里 也可以分布在堆里 棧幀棧幀由三部分組成 局部變量區(qū) 操作數(shù)棧和幀數(shù)據(jù)區(qū) Java的class文件 Class文件的內(nèi)容 在class文件中 可變長度項的大小和長度位于其實際數(shù)據(jù)之前 這個特性使得class文件數(shù)據(jù)流可以被順序解析 首先讀出項的大小 然后讀出項數(shù)據(jù)1 magic 魔數(shù) 4個字節(jié)2 minor version和major version4個字節(jié)3 constant pool count和constant pool4 access flags2個字節(jié)5 this class2個字節(jié) 6 super class2個字節(jié)7 interfaces count和interfaces8 fields count和fields9 methods count和fields10 attributes count和attributes Java代碼編譯和執(zhí)行的整個過程包含了以下三個重要的機制 1 Java源碼編譯機制2 類加載機制3 類執(zhí)行機制Java代碼編譯是由Java源碼編譯器來完成 流程圖如下所示 Java字節(jié)碼的執(zhí)行是由JVM執(zhí)行引擎來完成 流程圖如下所示 class文件由以下部分組成 1 結(jié)構(gòu)信息包括class文件格式版本號及各部分的數(shù)量與大小的信息2 元數(shù)據(jù)對應(yīng)于Java源碼中聲明與常量的信息 包含類 繼承的超類 實現(xiàn)的接口的聲明信息 域與方法聲明信息和常量池3 方法信息 對應(yīng)Java源碼中語句和表達式對應(yīng)的信息 包含字節(jié)碼 異常處理器表 求值棧與局部變量區(qū)大小 求值棧的類型記錄 調(diào)試符號信息 Java中的類加載機制 Java中的類加載機制 JVM的類加載是通過ClassLoader及其子類來完成的 類的層次關(guān)系和加載順序可以由下圖來描述 BootstrapClassLoader 啟動類加載器 JAVA HOME中jre lib rt jar里所有的class 由C 實現(xiàn) 不是ClassLoader子類ExtensionClassLoader 擴展類加載器負責加載java平臺中擴展功能的一些jar包 包括 JAVA HOME中jre lib jar或 Djava ext dirs指定目錄下的jar包AppClassLoader 系統(tǒng)類加載器負責加載classpath中指定的jar包及目錄中classCustomClassLoader 用戶自定義類加載器 java lang ClassLoader的子類 屬于應(yīng)用程序根據(jù)自身需要自定義的ClassLoader 如tomcat jboss都會根據(jù)j2ee規(guī)范自行實現(xiàn)ClassLoader Java中的類加載雙親委派機制 JVM在加載類時默認采用的是 雙親委派機制 通俗的講 就是某個特定的類加載器在接到加載類的請求時 首先將加載任務(wù)委托給父類加載器 依次遞歸 如果父類加載器可以完成類加載任務(wù) 就成功返回 只有父類加載器無法完成此加載任務(wù)時 才自己去加載 java中的類執(zhí)行機制 JVM是基于棧的體系結(jié)構(gòu)來執(zhí)行class字節(jié)碼的 線程創(chuàng)建后 都會產(chǎn)生程序計數(shù)器 PC 和棧 Stack 程序計數(shù)器存放下一條要執(zhí)行的指令在方法內(nèi)的偏移量 棧中存放一個個棧幀 每個棧幀對應(yīng)著每個方法的每次調(diào)用 而棧幀又是有局部變量區(qū)和操作數(shù)棧兩部分組成 局部變量區(qū)用于存放方法中的局部變量和參數(shù) 操作數(shù)棧中用于存放方法執(zhí)行過程中產(chǎn)生的中間結(jié)果 java類的生命周期 裝載 就是把二進制形式的java類型讀入java虛擬機中 驗證 準備 為類變量分配內(nèi)存 設(shè)置默認值 但是在到達初始化之前 類變量都沒有初始化為真正的初始值解析 解析過程就是在類型的常量池中尋找類 接口 字段和方法的符號引用 把這些符號引用替換成直接引用的過程在符號引用被程序首次使用之前 連接這個步驟都是可選的 初始化 為類變量賦予正確的初始值 類實例化 為新的對象分配內(nèi)存為實例變量賦默認值為實例變量賦正確的初始值java編譯器為它編譯的每一個類都至少生成一個實例初始化方法 在java的class文件中 這個實例初始化方法被稱為 針對源代碼中每一個類的構(gòu)造方法 java編譯器都產(chǎn)生一個方法 JVM內(nèi)存回收 JVM內(nèi)存回收 根集 rootset 所謂根集就是正在執(zhí)行的Java程序可以訪問的引用變量的集合 包括局部變量 參數(shù) 類變量 程序可以使用引用變量訪問對象的屬性和調(diào)用對象的方法 垃圾收集首選需要確定從根開始哪些是可達的和哪些是不可達的 從根集可達的對象都是活動對象 它們不能作為垃圾被回收 這也包括從根集間接可達的對象 而根集通過任意路徑不可達的對象符合垃圾收集的條件 應(yīng)該被回收 常用的算法 1 引用計數(shù)法 ReferenceCountingollector 2 tracing算法 TracingCollector 3 compacting算法 CompactingCollector 4 copying算法 CopingCollector 5 generation算法 GenerationalCollector 6 adaptive算法 AdaptiveCollector Sun的JVMGenerationalCollecting算法 Sun的JVMGenerationalCollecting 垃圾回收 原理是這樣的 把對象分為年青代 Young 年老代 Tenured 持久代 Perm 對不同生命周期的對象使用不同的算法 基于對對象生命周期分析 1 Young 年輕代 年輕代分三個區(qū) 一個Eden區(qū) 兩個Survivor區(qū) 大部分對象在Eden區(qū)中生成 當Eden區(qū)滿時 還存活的對象將被復(fù)制到Survivor區(qū) 兩個中的一個 當這個Survivor區(qū)滿時 此區(qū)的存活對象將被復(fù)制到另外一個Survivor區(qū) 當這個Survivor去也滿了的時候 從第一個Survivor區(qū)復(fù)制過來的并且此時還存活的對象 將被復(fù)制年老區(qū) Tenured 需要注意 Survivor的兩個區(qū)是對稱的 沒先后關(guān)系 所以同一個區(qū)中可能同時存在從Eden復(fù)制過來對象 和從前一個Survivor復(fù)制過來的對象 而復(fù)制到

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論