Java學(xué)習(xí)之虛擬機運行時.ppt_第1頁
Java學(xué)習(xí)之虛擬機運行時.ppt_第2頁
Java學(xué)習(xí)之虛擬機運行時.ppt_第3頁
Java學(xué)習(xí)之虛擬機運行時.ppt_第4頁
Java學(xué)習(xí)之虛擬機運行時.ppt_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

,Java學(xué)習(xí)之- 虛擬機運行時,戎碼一生,2019/7/11,大綱,虛擬機內(nèi)部體系結(jié)構(gòu) 運行時基本流程 方法表 堆 程序計數(shù)器 Java棧 執(zhí)行引擎,2019/7/11,虛擬機內(nèi)部體系結(jié)構(gòu),方法區(qū),堆,棧,本地方法棧,PC寄存器,類裝在子系統(tǒng),class文件,執(zhí)行引擎,運行時數(shù)據(jù)區(qū),2019/7/11,開始,裝載,驗證,準備,解析,初始化,執(zhí)行方法,結(jié)束,垃圾回收,2019/7/11,運行時的流程-裝載,讀取二進制流 解析二進制流,并存入方法區(qū) 類型信息、字段、方法、常量池、類變量等 創(chuàng)建一個該類型的java.lang.Class對象,2019/7/11,運行時的流程-驗證,語義驗證,比如: 1. 檢查final的類不能被繼承 2. 檢查final的方法不能被重寫 3. 檢查超類和子類的方法的兼容性(是否出現(xiàn)同名方法,但是不是重載的情況) 4. 檢查各常量池入口之間的一致性,2019/7/11,運行時的流程-準備,類變量的內(nèi)存分配 類變量的默認值設(shè)置,a為實例變量,初始化階段該實例還未被創(chuàng)建。 b為類變量,準備階段分配 內(nèi)存,并設(shè)置默認值為0。,2019/7/11,運行時的流程-解析,把符號引用替換成直接引用,符號引用: 和字節(jié)碼中的信息基本類似。,直接引用: 1. 指向類型、類變量和類方法的直接引用可能是指向方法區(qū)的本地指針。 2. 指向?qū)嵗兞亢蛯嵗椒ǖ闹苯右枚际瞧屏俊?2019/7/11,運行時的流程-初始化,初始化類變量的值,有啥問題?,2019/7/11,運行時的流程-初始化,初始化類變量的值 先超類,后子類 初始化階段,通過調(diào)用方法對類變量初始化語句和靜態(tài)語句塊進行初始化 類變量初始化語句和靜態(tài)語句塊的執(zhí)行優(yōu)先級是相同的,按照Java源代碼中的順序一次執(zhí)行 實例變量不在這個階段進行初始化,而是在new操作的時候調(diào)用方法進行初始化 類變量初始化語句: /public static int staticInt; 不是類變量初始化語句 public static int staticInt = 5; public static double c = Math.random()*0.3; 靜態(tài)語句塊: static 。 ,2019/7/11,類初始化:方法,2019/7/11,實例初始化:方法,2019/7/11,方法表-方法查找,2019/7/11,方法表-方法查找,虛擬機規(guī)范沒有規(guī)定必須有方法表(方法表需要額外的內(nèi)存) 在字節(jié)碼裝載的時候存放到方法區(qū)中 私有方法和實例初始化方法調(diào)用指令:invokespecial 靜態(tài)方法的調(diào)用指令:invokestatic 每個類都有一個方法表,方法表包含從超類繼承來的實例方法 方法表中的方法是非私有、非靜態(tài)、非初始化的實例方法 方法表可以理解為一個指針數(shù)組,每個元素指向方法區(qū)中的某個方法 實例方法調(diào)用指令:invokevirtual 接口方法調(diào)用指令:invokeinterface 每個堆中的實例都有一個指向方法區(qū)的指針,都說接口方法調(diào)用 比實例方法慢, 為什么,why?,2019/7/11,方法表-Dog的方法表,2019/7/11,方法表-CockerSpaniel的方法表,2019/7/11,方法表-Dog的方法表,2019/7/11,堆,堆用來存儲創(chuàng)建的實例(對象、數(shù)組) 有分配新對象的指令,但沒有釋放對象內(nèi)存的指令,釋放內(nèi)存完全交由垃圾收集器來做 一個Java程序一個Java虛擬機實例,一個Java虛擬機實例一個堆 虛擬機或者Java程序之間的堆互不干擾,但同一個Java程序中的不同線程共享堆 堆空間不一定是連續(xù)的內(nèi)存區(qū),可動態(tài)伸縮,2019/7/11,堆-實現(xiàn)1,指向?qū)ο蟪氐闹羔?指向類數(shù)據(jù)的指針,堆,句柄,對象,實例數(shù)據(jù),對象鎖、等待集合,垃圾收集相關(guān)數(shù)據(jù),。,。,方法區(qū),類數(shù)據(jù),類數(shù)據(jù),類數(shù)據(jù),類數(shù)據(jù),類數(shù)據(jù),。,指向句柄池的指針,。,一個對象的引用,2019/7/11,堆-實現(xiàn)2,指向類數(shù)據(jù)的指針,實例數(shù)據(jù),堆,方法區(qū),類數(shù)據(jù),類數(shù)據(jù),類數(shù)據(jù),類數(shù)據(jù),類數(shù)據(jù),。,指向堆的指針,。,一個對象的引用,對象鎖、等待集合,垃圾收集相關(guān)數(shù)據(jù),。,對象,2019/7/11,程序計數(shù)器,每個線程一個程序計數(shù)器 總是指向下一條指令(在調(diào)用方法返回的時候是指向哪兒?) 在方法內(nèi)跳轉(zhuǎn)的時候會用到程序計數(shù)器,比如:goto fff9(程序計數(shù)器的值-7等于下一跳指令的位置) 程序計數(shù)器還有啥作用?,2019/7/11,Java棧,往Java棧中壓棧和出棧的目標是棧幀 每調(diào)用一個方法就創(chuàng)建一個棧幀 Java棧通常是預(yù)先分配一個較長的內(nèi)存空間,當空間不夠的時候再擴展Java棧 棧幀(與方法對應(yīng)) 局部變量區(qū)(存放方法參數(shù)和方法體中的局部變量,生命周期短) 操作數(shù)棧(棧幀中的棧,用于指令操作數(shù)存儲,生命周期短) 幀數(shù)據(jù)區(qū)(存放常量池指針、異常表的引用、調(diào)試數(shù)據(jù)、支持方法正常返回),2019/7/11,Java棧,Main類 main() 棧幀,Main類 main() 棧幀,ClassA類 棧幀,Main類 main() 棧幀,ClassA類 callClassBMethod() 棧幀,Main類 main() 棧幀,ClassA類 callClassBMethod() 棧幀,ClassB類 call() 棧幀,Main類 main() 棧幀,ClassA類 callClassBMethod() 棧幀,ClassB類 call() 棧幀,PrintStream類 println() 棧幀,Main類 main() 棧幀,Main類 main() 棧幀,ClassA類 callClassBMethod() 棧幀,ClassB類 call() 棧幀,。,棧底,棧頂,完成,出棧,println()完成,出棧,call()完成,出棧,callClassBMethod()和main()依次出棧,2019/7/11,Java棧-棧幀,a,指向常量池的指針,局部變量區(qū),幀數(shù)據(jù)區(qū),異常表的引用,調(diào)試數(shù)據(jù),支持方法返回,等等,b,c,d,g,h,e,f,this,操作數(shù)棧,0,1,2,3,4,5,7,9,10,2019/7/11,Java棧-棧幀,this引用,幀數(shù)據(jù)區(qū),1,result,88.88,幀數(shù)據(jù)區(qū),add

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論