欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

深入理解JVM虛擬機(jī)5:虛擬機(jī)字節(jié)碼執(zhí)行引擎-創(chuàng)新互聯(lián)

本文轉(zhuǎn)自: https://www.cnblogs.com/snailclimb/p/9086337.html

創(chuàng)新互聯(lián)不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對(duì)營(yíng)銷(xiāo)、技術(shù)、服務(wù)都有自己獨(dú)特見(jiàn)解,公司采取“創(chuàng)意+綜合+營(yíng)銷(xiāo)”一體化的方式為您提供更專(zhuān)業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時(shí),也能得到同行業(yè)的專(zhuān)業(yè)認(rèn)可,能夠?yàn)樾袠I(yè)創(chuàng)新發(fā)展助力。未來(lái)將繼續(xù)專(zhuān)注于技術(shù)創(chuàng)新,服務(wù)升級(jí),滿足企業(yè)一站式全網(wǎng)整合營(yíng)銷(xiāo)推廣需求,讓再小的品牌網(wǎng)站制作也能產(chǎn)生價(jià)值!

本系列文章將整理到我在GitHub上的《Java面試指南》倉(cāng)庫(kù),更多精彩內(nèi)容請(qǐng)到我的倉(cāng)庫(kù)里查看

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

喜歡的話麻煩點(diǎn)下Star哈

文章將同步到我的個(gè)人博客:

www.how2playlife.com

本文是微信公眾號(hào)【Java技術(shù)江湖】的《深入理解JVM虛擬機(jī)》其中一篇,本文部分內(nèi)容來(lái)源于網(wǎng)絡(luò),為了把本文主題講得清晰透徹,也整合了很多我認(rèn)為不錯(cuò)的技術(shù)博客內(nèi)容,引用其中了一些比較好的博客文章,如有侵權(quán),請(qǐng)聯(lián)系作者。

該系列博文會(huì)告訴你如何從入門(mén)到進(jìn)階,一步步地學(xué)習(xí)JVM基礎(chǔ)知識(shí),并上手進(jìn)行JVM調(diào)優(yōu)實(shí)戰(zhàn),JVM是每一個(gè)Java工程師必須要學(xué)習(xí)和理解的知識(shí)點(diǎn),你必須要掌握其實(shí)現(xiàn)原理,才能更完整地了解整個(gè)Java技術(shù)體系,形成自己的知識(shí)框架。

為了更好地總結(jié)和檢驗(yàn)?zāi)愕膶W(xué)習(xí)成果,本系列文章也會(huì)提供每個(gè)知識(shí)點(diǎn)對(duì)應(yīng)的面試題以及參考答案。

如果對(duì)本系列文章有什么建議,或者是有什么疑問(wèn)的話,也可以關(guān)注公眾號(hào)【Java技術(shù)江湖】聯(lián)系作者,歡迎你參與本系列博文的創(chuàng)作和修訂。

1 概述

執(zhí)行引擎是java虛擬機(jī)最核心的組成部件之一。虛擬機(jī)的執(zhí)行引擎由自己實(shí)現(xiàn),所以可以自行定制指令集與執(zhí)行引擎的結(jié)構(gòu)體系,并且能夠執(zhí)行那些不被硬件直接支持的指令集格式。

所有的Java虛擬機(jī)的執(zhí)行引擎都是一致的: 輸入的是字節(jié)碼文件,處理過(guò)程是字節(jié)碼解析的等效過(guò)程,輸出的是執(zhí)行結(jié)果。本節(jié)將主要從概念模型的角度來(lái)講解 虛擬機(jī)的方法調(diào)用和字節(jié)碼執(zhí)行

2 運(yùn)行時(shí)棧幀結(jié)構(gòu)

棧幀(Stack Frame) 是用于支持虛擬機(jī)方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu),它是虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)中 虛擬機(jī)棧(Virtual Machine Stack)的棧元素

棧幀存儲(chǔ)了方法的局部變量表、操作數(shù)棧、動(dòng)態(tài)連接和方法返回地址等信息。每一個(gè)方法從調(diào)用開(kāi)始至執(zhí)行完成的過(guò)程,都對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧里面從入棧到出棧的過(guò)程。

棧幀概念結(jié)構(gòu)如下圖所示:

2.1 局部變量表

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

對(duì)于64位的數(shù)據(jù)類(lèi)型(Java語(yǔ)言中明確的64位數(shù)據(jù)類(lèi)型只有l(wèi)ong和double),虛擬機(jī)會(huì)以高位對(duì)齊的方式為其分配兩個(gè)連續(xù)的Slot空間。

虛擬機(jī)通過(guò)索引定位的方式使用局部變量表,索引值的范圍從0開(kāi)始至局部變量表大的Slot數(shù)量。訪問(wèn)的是32位數(shù)據(jù)類(lèi)型的變量,索引n就代表了使用第n個(gè)Slot,如果是64位數(shù)據(jù)類(lèi)型,就代表會(huì)同時(shí)使用n和n+1這兩個(gè)Slot。

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

2.2 操作數(shù)棧

操作數(shù)棧(Operand Stack) 也常稱(chēng)為操作棧,它是一個(gè) 后入先出棧。當(dāng)一個(gè)方法執(zhí)行開(kāi)始時(shí),這個(gè)方法的操作數(shù)棧是空的,在方法執(zhí)行過(guò)程中,會(huì)有各種字節(jié)碼指令往操作數(shù)棧中寫(xiě)入和提取內(nèi)容,也就是 出棧/入棧操作。

在概念模型中,一個(gè)活動(dòng)線程中兩個(gè)棧幀是相互獨(dú)立的。但大多數(shù)虛擬機(jī)實(shí)現(xiàn)都會(huì)做一些優(yōu)化處理:讓下一個(gè)棧幀的部分操作數(shù)棧與上一個(gè)棧幀的部分局部變量表重疊在一起,這樣的好處是方法調(diào)用時(shí)可以共享一部分?jǐn)?shù)據(jù),而無(wú)須進(jìn)行額外的參數(shù)復(fù)制傳遞。

2.3 動(dòng)態(tài)連接

每個(gè)棧幀都包含一個(gè)指向運(yùn)行時(shí)常量池中該棧幀所屬方法的引用,持有這個(gè)引用是為了支持方法調(diào)用過(guò)程中的 動(dòng)態(tài)連接

字節(jié)碼中方法調(diào)用指令是以常量池中的指向方法的符號(hào)引用為參數(shù)的,有一部分符號(hào)引用會(huì)在類(lèi)加載階段或第一次使用的時(shí)候轉(zhuǎn)化為直接引用,這種轉(zhuǎn)化稱(chēng)為 靜態(tài)解析,另外一部分在每次的運(yùn)行期間轉(zhuǎn)化為直接引用,這部分稱(chēng)為 動(dòng)態(tài)連接

2.4 方法返回地址

當(dāng)一個(gè)方法被執(zhí)行后,有兩種方式退出這個(gè)方法:

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

  • 另外一種是在方法執(zhí)行過(guò)程中遇到了異常,并且這個(gè)異常沒(méi)有在方法體內(nèi)得到處理(即本方法異常處理表中沒(méi)有匹配的異常處理器),就會(huì)導(dǎo)致方法退出,這種退出方式稱(chēng)為 異常完成出口(Abrupt Method Invocation Completion)
    注意:這種退出方式不會(huì)給上層調(diào)用者產(chǎn)生任何返回值。

無(wú)論采用何種退出方式,在方法退出后,都需要返回到方法被調(diào)用的位置,程序才能繼續(xù)執(zhí)行,方法返回時(shí)可能需要在棧幀中保存一些信息,用來(lái)幫助恢復(fù)它的上層方法的執(zhí)行狀態(tài)。一般來(lái)說(shuō),方法正常退出時(shí),調(diào)用者的PC計(jì)數(shù)器的值可以作為返回地址,棧幀中很可能會(huì)保存這個(gè)計(jì)數(shù)器值。而方法異常退出時(shí),返回地址是通過(guò)異常處理器表來(lái)確定的,棧幀中一般不會(huì)保存這部分信息。

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

2.5 附加信息

虛擬機(jī)規(guī)范允許虛擬機(jī)實(shí)現(xiàn)向棧幀中添加一些自定義的附加信息,例如與調(diào)試相關(guān)的信息等。

3 方法調(diào)用

方法調(diào)用階段的目的: 確定被調(diào)用方法的版本(哪一個(gè)方法),不涉及方法內(nèi)部的具體運(yùn)行過(guò)程,在程序運(yùn)行時(shí),進(jìn)行方法調(diào)用是最普遍、最頻繁的操作。

一切方法調(diào)用在Class文件里存儲(chǔ)的都只是符號(hào)引用,這是需要在類(lèi)加載期間或者是運(yùn)行期間,才能確定為方法在實(shí)際 運(yùn)行時(shí)內(nèi)存布局中的入口地址(相當(dāng)于之前說(shuō)的直接引用)

3.1 解析

“編譯期可知,運(yùn)行期不可變”的方法(靜態(tài)方法和私有方法),在類(lèi)加載的解析階段,會(huì)將其符號(hào)引用轉(zhuǎn)化為直接引用(入口地址)。這類(lèi)方法的調(diào)用稱(chēng)為“ 解析(Resolution)”。

在Java虛擬機(jī)中提供了5條方法調(diào)用字節(jié)碼指令:

  • invokestatic : 調(diào)用靜態(tài)方法
  • invokespecial:調(diào)用實(shí)例構(gòu)造器方法、私有方法、父類(lèi)方法
  • invokevirtual:調(diào)用所有的虛方法
  • invokeinterface:調(diào)用接口方法,會(huì)在運(yùn)行時(shí)在確定一個(gè)實(shí)現(xiàn)此接口的對(duì)象
  • invokedynamic:先在運(yùn)行時(shí)動(dòng)態(tài)解析出點(diǎn)限定符所引用的方法,然后再執(zhí)行該方法,在此之前的4條調(diào)用命令的分派邏輯是固化在Java虛擬機(jī)內(nèi)部的,而invokedynamic指令的分派邏輯是由用戶所設(shè)定的引導(dǎo)方法決定的。

3.2 分派

分派調(diào)用過(guò)程將會(huì)揭示多態(tài)性特征的一些最基本的體現(xiàn),如“重載”和“重寫(xiě)”在Java虛擬中是如何實(shí)現(xiàn)的。

1 靜態(tài)分派

所有依賴靜態(tài)類(lèi)型來(lái)定位方法執(zhí)行版本的分派動(dòng)作,都稱(chēng)為靜態(tài)分派。靜態(tài)分派發(fā)生在編譯階段。

靜態(tài)分派最典型的應(yīng)用就是方法重載。

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
    }
}

運(yùn)行結(jié)果:

Human guy

Human guy

為什么會(huì)出現(xiàn)這樣的結(jié)果呢?

Human man = new Man();其中的Human稱(chēng)為變量的 靜態(tài)類(lèi)型(Static Type),Man稱(chēng)為變量的 實(shí)際類(lèi)型(Actual Type)
兩者的區(qū)別是:靜態(tài)類(lèi)型在編譯器可知,而實(shí)際類(lèi)型到運(yùn)行期才確定下來(lái)。
在重載時(shí)通過(guò)參數(shù)的靜態(tài)類(lèi)型而不是實(shí)際類(lèi)型作為判定依據(jù),因此,在編譯階段,Javac編譯器會(huì)根據(jù)參數(shù)的靜態(tài)類(lèi)型決定使用哪個(gè)重載版本。所以選擇了sayhello(Human)作為調(diào)用目標(biāo),并把這個(gè)方法的符號(hào)引用寫(xiě)到main()方法里的兩條invokevirtual指令的參數(shù)中。

2 動(dòng)態(tài)分派

在運(yùn)行期根據(jù)實(shí)際類(lèi)型確定方法執(zhí)行版本的分派過(guò)程稱(chēng)為動(dòng)態(tài)分派。最典型的應(yīng)用就是方法重寫(xiě)。

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();
    }
}

運(yùn)行結(jié)果:

man

woman

woman

3 單分派和多分派

方法的接收者、方法的參數(shù)都可以稱(chēng)為方法的宗量。根據(jù)分批基于多少種宗量,可以將分派劃分為單分派和多分派。 單分派是根據(jù)一個(gè)宗量對(duì)目標(biāo)方法進(jìn)行選擇的,多分派是根據(jù)多于一個(gè)的宗量對(duì)目標(biāo)方法進(jìn)行選擇的。

Java在進(jìn)行靜態(tài)分派時(shí),選擇目標(biāo)方法要依據(jù)兩點(diǎn):一是變量的靜態(tài)類(lèi)型是哪個(gè)類(lèi)型,二是方法參數(shù)是什么類(lèi)型。因?yàn)橐鶕?jù)兩個(gè)宗量進(jìn)行選擇,所以Java語(yǔ)言的靜態(tài)分派屬于多分派類(lèi)型。

運(yùn)行時(shí)階段的動(dòng)態(tài)分派過(guò)程,由于編譯器已經(jīng)確定了目標(biāo)方法的簽名(包括方法參數(shù)),運(yùn)行時(shí)虛擬機(jī)只需要確定方法的接收者的實(shí)際類(lèi)型,就可以分派。因?yàn)槭歉鶕?jù)一個(gè)宗量作為選擇依據(jù),所以Java語(yǔ)言的動(dòng)態(tài)分派屬于單分派類(lèi)型。

注:到JDK1.7時(shí),Java語(yǔ)言還是靜態(tài)多分派、動(dòng)態(tài)單分派的語(yǔ)言,未來(lái)有可能支持動(dòng)態(tài)多分派。

4 虛擬機(jī)動(dòng)態(tài)分派的實(shí)現(xiàn)

由于動(dòng)態(tài)分派是非常頻繁的動(dòng)作,而動(dòng)態(tài)分派在方法版本選擇過(guò)程中又需要在方法元數(shù)據(jù)中搜索合適的目標(biāo)方法,虛擬機(jī)實(shí)現(xiàn)出于性能的考慮,通常不直接進(jìn)行如此頻繁的搜索,而是采用優(yōu)化方法。

其中一種“穩(wěn)定優(yōu)化”手段是:在類(lèi)的方法區(qū)中建立一個(gè) 虛方法表(Virtual Method Table, 也稱(chēng)vtable, 與此對(duì)應(yīng),也存在接口方法表——Interface Method Table,也稱(chēng)itable)。 使用虛方法表索引來(lái)代替元數(shù)據(jù)查找以提高性能。其原理與C++的虛函數(shù)表類(lèi)似。

虛方法表中存放的是各個(gè)方法的實(shí)際入口地址。如果某個(gè)方法在子類(lèi)中沒(méi)有被重寫(xiě),那子類(lèi)的虛方法表里面的地址入口和父類(lèi)中該方法相同,都指向父類(lèi)的實(shí)現(xiàn)入口。虛方法表一般在類(lèi)加載的連接階段進(jìn)行初始化。

3.3 動(dòng)態(tài)類(lèi)型語(yǔ)言的支持

JDK新增加了invokedynamic指令來(lái)是實(shí)現(xiàn)“動(dòng)態(tài)類(lèi)型語(yǔ)言”。

靜態(tài)語(yǔ)言和動(dòng)態(tài)語(yǔ)言的區(qū)別:

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

4 基于棧的字節(jié)碼解釋執(zhí)行引擎

虛擬機(jī)如何調(diào)用方法的內(nèi)容已經(jīng)講解完畢,現(xiàn)在我們來(lái)探討虛擬機(jī)是如何執(zhí)行方法中的字節(jié)碼指令。

4.1 解釋執(zhí)行

Java語(yǔ)言經(jīng)常被人們定位為 “解釋執(zhí)行”語(yǔ)言,在Java初生的JDK1.0時(shí)代,這種定義還比較準(zhǔn)確的,但當(dāng)主流的虛擬機(jī)中都包含了即時(shí)編譯后,Class文件中的代碼到底會(huì)被解釋執(zhí)行還是編譯執(zhí)行,就成了只有虛擬機(jī)自己才能準(zhǔn)確判斷的事情。再后來(lái),Java也發(fā)展出來(lái)了直接生成本地代碼的編譯器[如何GCJ(GNU Compiler for the Java)],而C/C++也出現(xiàn)了通過(guò)解釋器執(zhí)行的版本(如CINT),這時(shí)候再籠統(tǒng)的說(shuō)“解釋執(zhí)行”,對(duì)于整個(gè)Java語(yǔ)言來(lái)說(shuō)就成了幾乎沒(méi)有任何意義的概念, 只有確定了談?wù)搶?duì)象是某種具體的Java實(shí)現(xiàn)版本和執(zhí)行引擎運(yùn)行模式時(shí),談解釋執(zhí)行還是編譯執(zhí)行才會(huì)比較確切

Java語(yǔ)言中,javac編譯器完成了程序代碼經(jīng)過(guò)詞法分析、語(yǔ)法分析到抽象語(yǔ)法樹(shù),再遍歷語(yǔ)法樹(shù)生成線性的字節(jié)碼指令流的過(guò)程,因?yàn)檫@一部分動(dòng)作是在Java虛擬機(jī)之外進(jìn)行的,而解釋器在虛擬機(jī)內(nèi)部,所以Java程序的編譯就是半獨(dú)立實(shí)現(xiàn)的,

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

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

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

舉個(gè)簡(jiǎn)單例子,分別使用這兩種指令計(jì)算1+1的結(jié)果, 基于棧的指令集是這個(gè)樣子:
iconst_1

iconst_1

iadd

istore_0

兩條iconst_1指令連續(xù)把兩個(gè)常量1壓入棧后,iadd指令把棧頂?shù)膬蓚€(gè)值出棧、相加,然后將結(jié)果放回棧頂,最后istore_0把棧頂?shù)闹捣诺骄植孔兞勘碇械牡?個(gè)Slot中。

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

mov eax, 1

add eax, 1

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

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

棧架構(gòu)的指令集還有一些其他的優(yōu)點(diǎn),如代碼相對(duì)更加緊湊,編譯器實(shí)現(xiàn)更加簡(jiǎn)單等。
棧架構(gòu)指令集的主要缺點(diǎn)是執(zhí)行速度相對(duì)來(lái)說(shuō)會(huì)稍微慢一些。

總結(jié)

本節(jié)中,我們分析了虛擬機(jī)在執(zhí)行代碼時(shí),如何找到正確的方法、如何執(zhí)行方法內(nèi)的字節(jié)碼,以及執(zhí)行代碼時(shí)涉及的內(nèi)存結(jié)構(gòu)。

文章名稱(chēng):深入理解JVM虛擬機(jī)5:虛擬機(jī)字節(jié)碼執(zhí)行引擎-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://www.chinadenli.net/article10/ihogo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)網(wǎng)站設(shè)計(jì)公司商城網(wǎng)站營(yíng)銷(xiāo)型網(wǎng)站建設(shè)網(wǎng)站導(dǎo)航微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)