久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

深入理解JVM虛擬機5:虛擬機字節碼執行引擎-創新互聯

本文轉自: https://www.cnblogs.com/snailclimb/p/9086337.html

創新互聯不只是一家網站建設的網絡公司;我們對營銷、技術、服務都有自己獨特見解,公司采取“創意+綜合+營銷”一體化的方式為您提供更專業的服務!我們經歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關注我們的網站設計制作、成都網站設計質量和服務品質,在得到用戶滿意的同時,也能得到同行業的專業認可,能夠為行業創新發展助力。未來將繼續專注于技術創新,服務升級,滿足企業一站式全網整合營銷推廣需求,讓再小的品牌網站制作也能產生價值!

本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到我的倉庫里查看

https://github.com/h3pl/Java-Tutorial

喜歡的話麻煩點下Star哈

文章將同步到我的個人博客:

www.how2playlife.com

本文是微信公眾號【Java技術江湖】的《深入理解JVM虛擬機》其中一篇,本文部分內容來源于網絡,為了把本文主題講得清晰透徹,也整合了很多我認為不錯的技術博客內容,引用其中了一些比較好的博客文章,如有侵權,請聯系作者。

該系列博文會告訴你如何從入門到進階,一步步地學習JVM基礎知識,并上手進行JVM調優實戰,JVM是每一個Java工程師必須要學習和理解的知識點,你必須要掌握其實現原理,才能更完整地了解整個Java技術體系,形成自己的知識框架。

為了更好地總結和檢驗你的學習成果,本系列文章也會提供每個知識點對應的面試題以及參考答案。

如果對本系列文章有什么建議,或者是有什么疑問的話,也可以關注公眾號【Java技術江湖】聯系作者,歡迎你參與本系列博文的創作和修訂。

1 概述

執行引擎是java虛擬機最核心的組成部件之一。虛擬機的執行引擎由自己實現,所以可以自行定制指令集與執行引擎的結構體系,并且能夠執行那些不被硬件直接支持的指令集格式。

所有的Java虛擬機的執行引擎都是一致的: 輸入的是字節碼文件,處理過程是字節碼解析的等效過程,輸出的是執行結果。本節將主要從概念模型的角度來講解 虛擬機的方法調用和字節碼執行

2 運行時棧幀結構

棧幀(Stack Frame) 是用于支持虛擬機方法調用和方法執行的數據結構,它是虛擬機運行時數據區中 虛擬機棧(Virtual Machine Stack)的棧元素

棧幀存儲了方法的局部變量表、操作數棧、動態連接和方法返回地址等信息。每一個方法從調用開始至執行完成的過程,都對應著一個棧幀在虛擬機棧里面從入棧到出棧的過程。

棧幀概念結構如下圖所示:

2.1 局部變量表

局部變量表是一組變量值存儲空間,用于存放方法參數和方法內定義的局部變量。
局部變量表的容量以變量槽(Variable Slot)為最小單位。 一個Slot可以存放一個32位以內(boolean、byte、char、short、int、float、reference和returnAddress)的數據類型,reference類型表示一個對象實例的引用,returnAddress已經很少見了,可以忽略。

對于64位的數據類型(Java語言中明確的64位數據類型只有long和double),虛擬機會以高位對齊的方式為其分配兩個連續的Slot空間。

虛擬機通過索引定位的方式使用局部變量表,索引值的范圍從0開始至局部變量表大的Slot數量。訪問的是32位數據類型的變量,索引n就代表了使用第n個Slot,如果是64位數據類型,就代表會同時使用n和n+1這兩個Slot。

為了節省棧幀空間,局部變量Slot可以重用,方法體中定義的變量,其作用域并不一定會覆蓋整個方法體。如果當前字節碼PC計數器的值超出了某個變量的作用域,那么這個變量的Slot就可以交給其他變量使用。這樣的設計會帶來一些額外的副作用,比如:在某些情況下,Slot的復用會直接影響到系統的收集行為。

2.2 操作數棧

操作數棧(Operand Stack) 也常稱為操作棧,它是一個 后入先出棧。當一個方法執行開始時,這個方法的操作數棧是空的,在方法執行過程中,會有各種字節碼指令往操作數棧中寫入和提取內容,也就是 出棧/入棧操作。

在概念模型中,一個活動線程中兩個棧幀是相互獨立的。但大多數虛擬機實現都會做一些優化處理:讓下一個棧幀的部分操作數棧與上一個棧幀的部分局部變量表重疊在一起,這樣的好處是方法調用時可以共享一部分數據,而無須進行額外的參數復制傳遞。

2.3 動態連接

每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用,持有這個引用是為了支持方法調用過程中的 動態連接

字節碼中方法調用指令是以常量池中的指向方法的符號引用為參數的,有一部分符號引用會在類加載階段或第一次使用的時候轉化為直接引用,這種轉化稱為 靜態解析,另外一部分在每次的運行期間轉化為直接引用,這部分稱為 動態連接

2.4 方法返回地址

當一個方法被執行后,有兩種方式退出這個方法:

  • 第一種是執行引擎遇到任意一個方法返回的字節碼指令,這種退出方法的方式稱為 正常完成出口(Normal Method Invocation Completion)

  • 另外一種是在方法執行過程中遇到了異常,并且這個異常沒有在方法體內得到處理(即本方法異常處理表中沒有匹配的異常處理器),就會導致方法退出,這種退出方式稱為 異常完成出口(Abrupt Method Invocation Completion)
    注意:這種退出方式不會給上層調用者產生任何返回值。

無論采用何種退出方式,在方法退出后,都需要返回到方法被調用的位置,程序才能繼續執行,方法返回時可能需要在棧幀中保存一些信息,用來幫助恢復它的上層方法的執行狀態。一般來說,方法正常退出時,調用者的PC計數器的值可以作為返回地址,棧幀中很可能會保存這個計數器值。而方法異常退出時,返回地址是通過異常處理器表來確定的,棧幀中一般不會保存這部分信息。

方法退出的過程實際上等同于把當前棧幀出棧,因此退出時可能執行的操作有:恢復上層方法的局部變量表和操作數棧,把返回值(如果有的話)壓入調用者棧幀的操作數棧中,調整PC計數器的值以指向方法調用指令后面的一條指令等。

2.5 附加信息

虛擬機規范允許虛擬機實現向棧幀中添加一些自定義的附加信息,例如與調試相關的信息等。

3 方法調用

方法調用階段的目的: 確定被調用方法的版本(哪一個方法),不涉及方法內部的具體運行過程,在程序運行時,進行方法調用是最普遍、最頻繁的操作。

一切方法調用在Class文件里存儲的都只是符號引用,這是需要在類加載期間或者是運行期間,才能確定為方法在實際 運行時內存布局中的入口地址(相當于之前說的直接引用)

3.1 解析

“編譯期可知,運行期不可變”的方法(靜態方法和私有方法),在類加載的解析階段,會將其符號引用轉化為直接引用(入口地址)。這類方法的調用稱為“ 解析(Resolution)”。

在Java虛擬機中提供了5條方法調用字節碼指令:

  • invokestatic : 調用靜態方法
  • invokespecial:調用實例構造器方法、私有方法、父類方法
  • invokevirtual:調用所有的虛方法
  • invokeinterface:調用接口方法,會在運行時在確定一個實現此接口的對象
  • invokedynamic:先在運行時動態解析出點限定符所引用的方法,然后再執行該方法,在此之前的4條調用命令的分派邏輯是固化在Java虛擬機內部的,而invokedynamic指令的分派邏輯是由用戶所設定的引導方法決定的。

3.2 分派

分派調用過程將會揭示多態性特征的一些最基本的體現,如“重載”和“重寫”在Java虛擬中是如何實現的。

1 靜態分派

所有依賴靜態類型來定位方法執行版本的分派動作,都稱為靜態分派。靜態分派發生在編譯階段。

靜態分派最典型的應用就是方法重載。

package jvm8_3_2;
public class StaticDispatch {
    static abstract class Human {
    }
    static class Man extends Human {
    }
    static class Woman extends Human {
    }
    public void sayhello(Human guy) {
        System.out.println("Human guy");
    }
    public void sayhello(Man guy) {
        System.out.println("Man guy");
    }
    public void sayhello(Woman guy) {
        System.out.println("Woman guy");
    }
    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        StaticDispatch staticDispatch = new StaticDispatch();
        staticDispatch.sayhello(man);// Human guy
        staticDispatch.sayhello(woman);// Human guy
    }
}

運行結果:

Human guy

Human guy

為什么會出現這樣的結果呢?

Human man = new Man();其中的Human稱為變量的 靜態類型(Static Type),Man稱為變量的 實際類型(Actual Type)
兩者的區別是:靜態類型在編譯器可知,而實際類型到運行期才確定下來。
在重載時通過參數的靜態類型而不是實際類型作為判定依據,因此,在編譯階段,Javac編譯器會根據參數的靜態類型決定使用哪個重載版本。所以選擇了sayhello(Human)作為調用目標,并把這個方法的符號引用寫到main()方法里的兩條invokevirtual指令的參數中。

2 動態分派

在運行期根據實際類型確定方法執行版本的分派過程稱為動態分派。最典型的應用就是方法重寫。

package jvm8_3_2;
public class DynamicDisptch {
    static abstract class Human {
        abstract void sayhello();
    }
    static class Man extends Human {
        @Override
        void sayhello() {
            System.out.println("man");
        }
    }
    static class Woman extends Human {
        @Override
        void sayhello() {
            System.out.println("woman");
        }
    }
    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        man.sayhello();
        woman.sayhello();
        man = new Woman();
        man.sayhello();
    }
}

運行結果:

man

woman

woman

3 單分派和多分派

方法的接收者、方法的參數都可以稱為方法的宗量。根據分批基于多少種宗量,可以將分派劃分為單分派和多分派。 單分派是根據一個宗量對目標方法進行選擇的,多分派是根據多于一個的宗量對目標方法進行選擇的。

Java在進行靜態分派時,選擇目標方法要依據兩點:一是變量的靜態類型是哪個類型,二是方法參數是什么類型。因為要根據兩個宗量進行選擇,所以Java語言的靜態分派屬于多分派類型。

運行時階段的動態分派過程,由于編譯器已經確定了目標方法的簽名(包括方法參數),運行時虛擬機只需要確定方法的接收者的實際類型,就可以分派。因為是根據一個宗量作為選擇依據,所以Java語言的動態分派屬于單分派類型。

注:到JDK1.7時,Java語言還是靜態多分派、動態單分派的語言,未來有可能支持動態多分派。

4 虛擬機動態分派的實現

由于動態分派是非常頻繁的動作,而動態分派在方法版本選擇過程中又需要在方法元數據中搜索合適的目標方法,虛擬機實現出于性能的考慮,通常不直接進行如此頻繁的搜索,而是采用優化方法。

其中一種“穩定優化”手段是:在類的方法區中建立一個 虛方法表(Virtual Method Table, 也稱vtable, 與此對應,也存在接口方法表——Interface Method Table,也稱itable)。 使用虛方法表索引來代替元數據查找以提高性能。其原理與C++的虛函數表類似。

虛方法表中存放的是各個方法的實際入口地址。如果某個方法在子類中沒有被重寫,那子類的虛方法表里面的地址入口和父類中該方法相同,都指向父類的實現入口。虛方法表一般在類加載的連接階段進行初始化。

3.3 動態類型語言的支持

JDK新增加了invokedynamic指令來是實現“動態類型語言”。

靜態語言和動態語言的區別:

  • 靜態語言(強類型語言)
    靜態語言是在編譯時變量的數據類型即可確定的語言,多數靜態類型語言要求在使用變量之前必須聲明數據類型。
    例如:C++、Java、Delphi、C#等。
  • 動態語言(弱類型語言)
    動態語言是在運行時確定數據類型的語言。變量使用之前不需要類型聲明,通常變量的類型是被賦值的那個值的類型。
    例如PHP/ASP/Ruby/Python/Perl/ABAP/SQL/JavaScript/Unix Shell等等。
  • 強類型定義語言
    強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那么它就永遠是這個數據類型了。舉個例子:如果你定義了一個整型變量a,那么程序根本不可能將a當作字符串類型處理。強類型定義語言是類型安全的語言。
  • 弱類型定義語言
    數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變量可以賦不同數據類型的值。強類型定義語言在速度上可能略遜色于弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。

4 基于棧的字節碼解釋執行引擎

虛擬機如何調用方法的內容已經講解完畢,現在我們來探討虛擬機是如何執行方法中的字節碼指令。

4.1 解釋執行

Java語言經常被人們定位為 “解釋執行”語言,在Java初生的JDK1.0時代,這種定義還比較準確的,但當主流的虛擬機中都包含了即時編譯后,Class文件中的代碼到底會被解釋執行還是編譯執行,就成了只有虛擬機自己才能準確判斷的事情。再后來,Java也發展出來了直接生成本地代碼的編譯器[如何GCJ(GNU Compiler for the Java)],而C/C++也出現了通過解釋器執行的版本(如CINT),這時候再籠統的說“解釋執行”,對于整個Java語言來說就成了幾乎沒有任何意義的概念, 只有確定了談論對象是某種具體的Java實現版本和執行引擎運行模式時,談解釋執行還是編譯執行才會比較確切

Java語言中,javac編譯器完成了程序代碼經過詞法分析、語法分析到抽象語法樹,再遍歷語法樹生成線性的字節碼指令流的過程,因為這一部分動作是在Java虛擬機之外進行的,而解釋器在虛擬機內部,所以Java程序的編譯就是半獨立實現的,

4.2 基于棧的指令集和基于寄存器的指令集

Java編譯器輸出的指令流,基本上是一種 基于棧的指令集架構(Instruction Set Architecture,ISA)依賴操作數棧進行工作。與之相對應的另一套常用的指令集架構是 基于寄存器的指令集依賴寄存器進行工作

那么, 基于棧的指令集和基于寄存器的指令集這兩者有什么不同呢?

舉個簡單例子,分別使用這兩種指令計算1+1的結果, 基于棧的指令集是這個樣子:
iconst_1

iconst_1

iadd

istore_0

兩條iconst_1指令連續把兩個常量1壓入棧后,iadd指令把棧頂的兩個值出棧、相加,然后將結果放回棧頂,最后istore_0把棧頂的值放到局部變量表中的第0個Slot中。

如果基于寄存器的指令集,那程序可能會是這個樣子:

mov eax, 1

add eax, 1

mov指令把EAX寄存器的值設置為1,然后add指令再把這個值加1,將結果就保存在EAX寄存器里面。

基于棧的指令集主要的優點就是可移植,寄存器是由硬件直接提供,程序直接依賴這些硬件寄存器則不可避免地要受到硬件的約束。

棧架構的指令集還有一些其他的優點,如代碼相對更加緊湊,編譯器實現更加簡單等。
棧架構指令集的主要缺點是執行速度相對來說會稍微慢一些。

總結

本節中,我們分析了虛擬機在執行代碼時,如何找到正確的方法、如何執行方法內的字節碼,以及執行代碼時涉及的內存結構。

文章名稱:深入理解JVM虛擬機5:虛擬機字節碼執行引擎-創新互聯
標題網址:http://www.js-pz168.com/article10/ihogo.html

成都網站建設公司_創新互聯,為您提供軟件開發網站設計公司商城網站營銷型網站建設網站導航微信公眾號

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
国产福利91精品一区二区三区| 久久99精品久久久久久水蜜桃| 久久av一区二区| 中文字幕一区二区三区有限公司| 日韩一区二区在线观看视频播放| 国产精品久久久久久久久搜平片| 日韩中文字幕麻豆| 99精品一区二区| 视频一区国产精品| 日韩女优毛片在线| 一区二区三区资源| 国产高清精品久久久久| 久久伊人资源站| 欧美日韩在线亚洲一区蜜芽| 欧美极品aⅴ影院| 蜜桃免费网站一区二区三区| 91视频你懂的| 色偷偷88欧美精品久久久| 久久亚洲一区二区三区四区| 亚洲国产成人高清精品| 不卡一二三区首页| 香蕉久久免费影视| 久久一留热品黄| 天堂午夜影视日韩欧美一区二区| 99久久精品免费| 色综合久久九月婷婷色综合| 久久精品一区蜜桃臀影院| 日韩国产一二三区| 99re国产视频| 欧美日韩第一区日日骚| 亚洲人成在线观看一区二区| 国产精品123区| 色综合电影网| 国产三级精品视频| 九九**精品视频免费播放| 久久精彩视频| 日韩女优av电影| 日本成人超碰在线观看| 国严精品久久久久久亚洲影视| 欧美二区三区91| 亚洲一区二区三区在线| 99国产精品久久久久| 在线视频国产一区| 亚洲日本欧美天堂| 不卡的av中国片| 色丁香久综合在线久综合在线观看| 日本一区二区视频在线| 国产精品一区免费视频| 亚洲欧美日韩精品久久久 | 日韩欧美国产一二三区| 亚洲sss视频在线视频| eeuss一区二区三区| 欧美精品在线观看播放| 亚洲444eee在线观看| 国产精品我不卡| 欧美va在线播放| 麻豆91在线播放| 日韩中文字幕一区二区| 国产精品日韩精品欧美在线| 丁香五精品蜜臀久久久久99网站 | 亚洲精品日日夜夜| 97se在线视频| 日韩一区二区免费在线电影| 日韩av高清在线观看| 免费观看国产成人| 国产无遮挡一区二区三区毛片日本| 国产伦精品一区二区三区免费迷| 亚洲欧洲一区二区在线观看| 最新国产成人在线观看| 91麻豆福利精品推荐| 日韩一二在线观看| 经典一区二区三区| 在线视频不卡一区二区| 夜夜嗨av一区二区三区四季av | 日韩一区二区电影在线观看| 国产精品久久久久精k8| 99久久久精品| 日韩三级高清在线| 国产在线精品国自产拍免费| 色综合久久中文字幕综合网| 亚洲香肠在线观看| 欧美人与物videos另类| 国产精品久久久久久户外露出| 91性感美女视频| 欧美成人一区二区| 国产福利一区二区三区在线视频| 欧美在线免费观看亚洲| 日韩激情av在线| 一区二区精品在线| 亚洲国产人成综合网站| 欧美三级网色| 亚洲蜜臀av乱码久久精品蜜桃| 国产精品日韩二区| 国产欧美一区二区三区在线老狼| 97se狠狠狠综合亚洲狠狠| 精品国产亚洲在线| voyeur盗摄精品| 精品蜜桃在线看| 成人福利在线看| 欧美成人高清电影在线| 成人精品电影在线观看| 精品欧美久久久| jvid福利写真一区二区三区| 欧美成人aa大片| 不卡的av电影| 久久新电视剧免费观看| 91天堂素人约啪| 国产日韩欧美在线一区| 国产成人免费电影| 中文字幕日本不卡| 欧美福利精品| 亚洲午夜av在线| 色综合天天做天天爱| 奇米色777欧美一区二区| 在线观看成人小视频| 经典一区二区三区| 91精品久久久久久蜜臀| 成人开心网精品视频| 精品久久久久久无| 91麻豆免费看| 国产精品久久三| 欧洲高清一区二区| 婷婷综合另类小说色区| 欧美在线高清视频| 国产一区在线观看麻豆| 日韩免费在线观看| 97中文在线观看| 亚洲欧美在线另类| 日本不卡高清视频一区| 婷婷综合五月天| 欧美日韩五月天| 成人黄色777网| 欧美国产亚洲另类动漫| 免费亚洲一区二区| 天天色图综合网| 在线不卡中文字幕| 91亚洲国产成人精品一区二三 | 91精品国产欧美一区二区成人| 成人午夜私人影院| 国产视频视频一区| 欧美精品欧美精品系列c| 日韩精品欧美精品| 91麻豆精品久久久久蜜臀| 91在线精品一区二区三区| 国产精品护士白丝一区av| 神马影院午夜我不卡| 久久国产尿小便嘘嘘尿| 精品日韩99亚洲| 国产欧美日韩亚洲| 亚洲福利电影网| 欧美巨大另类极品videosbest| 波多野结衣中文一区| 亚洲人成在线观看一区二区| 色婷婷激情久久| 成人精品电影在线观看| 亚洲欧美在线视频观看| 色婷婷激情久久| 成人午夜激情影院| 日韩理论片中文av| 在线观看免费亚洲| 99精品视频一区二区三区| 亚洲美女免费在线| 欧美在线观看视频在线| 91免费看`日韩一区二区| 亚洲综合色婷婷| 3d动漫精品啪啪1区2区免费| 99在线高清视频在线播放| 午夜婷婷国产麻豆精品| 欧美成人在线直播| 欧美日韩在线精品| 国产精品亚洲一区二区三区在线| 欧美激情一区不卡| 色一区在线观看| jlzzjlzz国产精品久久| 亚洲曰韩产成在线| 日韩片之四级片| 欧美日韩精品久久| 国产精品中文字幕欧美| 亚洲天堂精品视频| 欧美三级蜜桃2在线观看| 丁香婷婷久久久综合精品国产| 亚洲gay无套男同| 欧美成人欧美edvon| 涩涩日韩在线| av中文字幕在线不卡| 亚洲国产欧美在线| 精品欧美一区二区三区精品久久| 日韩国产精品一区二区| 成人做爰69片免费看网站| 亚洲主播在线观看| 欧美成人一区二区三区在线观看| 日韩欧美亚洲日产国产| 成人精品免费视频| 亚洲国产欧美日韩另类综合| 日韩欧美中文字幕一区| 亚洲成人一区二区三区| 91网站在线播放| 免费成人av资源网| 国产精品传媒在线| 91精品国产综合久久精品性色|