曰本美女∴一区二区特级A级黄色大片, 国产亚洲精品美女久久久久久2025, 页岩实心砖-高密市宏伟建材有限公司, 午夜小视频在线观看欧美日韩手机在线,国产人妻奶水一区二区,国产玉足,妺妺窝人体色WWW网站孕妇,色综合天天综合网中文伊,成人在线麻豆网观看

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從Java入手如何了解虛擬機(jī)(VM)

汽車電子技術(shù) ? 來源:程序猿搬磚 ? 作者:壞人 ? 2023-03-03 10:00 ? 次閱讀

「這里的虛擬機(jī)不是模擬完整硬件的虛擬機(jī),這里主要了解的是JVM與DVM的架構(gòu),它們執(zhí)行的是字節(jié)碼。」

虛擬機(jī)的設(shè)計(jì)架構(gòu)有兩種: 基于求值棧、基于寄存器,如果從更大的范圍可以認(rèn)為只要實(shí)現(xiàn)了功能的都可以認(rèn)為是虛擬機(jī),通過直接遍歷AST得到結(jié)果的也可以算一種虛擬機(jī)。

「基于AST」 的虛擬機(jī)是通過后序遍歷AST節(jié)點(diǎn),利用調(diào)用棧遞歸的對(duì)AST求值,它的特點(diǎn)就是實(shí)現(xiàn)更簡(jiǎn)單,利用更低級(jí)語言或者自身來實(shí)現(xiàn)。

「基于求值堆?!?/strong> 的虛擬機(jī)是零地址指令設(shè)計(jì)的一個(gè)很好的實(shí)踐,它的操作數(shù)是隱藏在棧頂?shù)?利用了棧的先進(jìn)后出的特點(diǎn)實(shí)現(xiàn)了運(yùn)算的優(yōu)先級(jí),相對(duì)比寄存器方案他的指令數(shù)量更多,但是空間占用更低。

「基于虛擬寄存器」 的虛擬機(jī)可以是二地址或者三地址設(shè)計(jì),操作數(shù)存放在虛擬寄存器中,很多指令只需要對(duì)寄存器進(jìn)行讀取,不涉及到速度慢了很多的內(nèi)存,相對(duì)于求值棧的方案,指令數(shù)量更少,空間占用更高。

「有圖有真相」

下面我們來看一段非常簡(jiǎn)單的Java代碼,直觀的感受一下求值棧與寄存器方案的差異。

class Test {
  public static void foo() {  
        int a = 1;  
        int b = 2;  
        int c = (a + b) * 5;  
    } 
}

「求值棧寄存器」

這個(gè)程序很簡(jiǎn)單,使用javac將它編譯成字節(jié)碼,再利用javap查看指令

javac Test.java
javap -v Test

得到如下指令:圖片

接下來,通過觀察指令執(zhí)行流程了解JVM基于棧的邏輯:

可以看出,基于求值棧的VM在執(zhí)行的時(shí)候會(huì)反復(fù)的對(duì)棧進(jìn)行push與pop的操作,這樣一來需要執(zhí)行的指令條數(shù)就多了。

當(dāng)然,上面的指令是未優(yōu)化的,實(shí)際上在生成指令之前可以將a與b直接優(yōu)化掉(常數(shù)折疊),減少內(nèi)存占用。

「寄存器虛擬機(jī)」

同樣是執(zhí)行Java代碼, android 的Dalvik VM是采用基于寄存器的架構(gòu),通過以下命令:

dx --dex --no-optimize --output Test.dex Test.class

如果不顯示的指定--no-optimize,生成的Test.dex經(jīng)過優(yōu)化后,foo函數(shù)里面所有的變量與運(yùn)算都被優(yōu)化掉了,只剩下一個(gè)return-void指令,從上下文分析可以得出foo內(nèi)部的a,b,c變量與其參與的運(yùn)算都可以不需要。不經(jīng)過優(yōu)化的指令如下:

圖片指令執(zhí)行流程如下:圖片編譯期已經(jīng)確定棧幀的虛擬寄存器的數(shù)量,v3 v4是加載數(shù)據(jù)與運(yùn)算時(shí)使用的寄存器,v0 v1 v2則對(duì)面最后三個(gè)變量。

數(shù)據(jù)一量裝入寄存器,在盡可能不使用內(nèi)存的情況下只使用寄存器速度快得多,因?yàn)樗挥妙l繁與內(nèi)存打交道了。

任何事物都有兩面性,棧相比寄存器架構(gòu)它的可移植性更強(qiáng),棧在任何機(jī)器上實(shí)現(xiàn)都很容易。在java設(shè)計(jì)之初就希望它是一個(gè)能在所有平臺(tái)上通吃的語言,所以JVM基于棧。

而寄存器架構(gòu)的VM往往會(huì)把虛擬寄存器與實(shí)際的寄存器映射,如果虛擬寄存器的數(shù)量小于等于實(shí)際的寄存器,則實(shí)現(xiàn)起來相對(duì)容易,如果虛擬寄存器數(shù)量大于了實(shí)際的寄存器數(shù)量則相對(duì)復(fù)雜。

Dalvik只用于android平臺(tái),性能往往是更需要關(guān)注的東西,這樣來講android 4.0x開始基于寄存器的DVM就可以理解了,此時(shí)的設(shè)備內(nèi)存普遍高而且CPU的寄存器數(shù)量也多。

「總結(jié):」 棧與寄存器架構(gòu)各有優(yōu)劣,任何的事物在設(shè)計(jì)之初都有它考慮的重點(diǎn),它們沒有絕對(duì)的優(yōu)劣,如果你要用AST來實(shí)現(xiàn)運(yùn)算,只要滿足了你的要求,無可厚非。

好比時(shí)間與空間在寫的程序里永遠(yuǎn)是一個(gè)矛盾的存在,人們總是在追求一個(gè)極致的平衡點(diǎn)。

如果你覺得文章對(duì)你有幫助,可以分享給更多的人或者點(diǎn)在看。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5403

    瀏覽量

    122947
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    958

    瀏覽量

    28926
  • AST
    AST
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    2372
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    VM虛擬機(jī)與主機(jī)不能互ping通

    VM橋接方式將LINUX虛擬機(jī)加入主機(jī)的局域網(wǎng),兩者一個(gè)網(wǎng)段一個(gè)網(wǎng)關(guān),然后發(fā)現(xiàn)虛擬機(jī)能ping通局域網(wǎng)內(nèi)除了主機(jī)外的所有設(shè)備,唯獨(dú)不能ping通主機(jī),同樣,主機(jī)也不能ping 通虛擬機(jī)
    發(fā)表于 04-10 21:55

    請(qǐng)問QTE可以同幾種JAVA虛擬機(jī)集成

    《嵌入式linux應(yīng)用開發(fā)完全手冊(cè)》第500頁(yè)中有講:“QTE可以同幾種JAVA虛擬機(jī)集成。JAVA程序可以基于QTE的工作平臺(tái)上運(yùn)行,提供同源程序相同的效果”我就是想請(qǐng)問,是否有那個(gè)版本的QTE是有帶
    發(fā)表于 05-24 05:45

    VM虛擬機(jī)開機(jī)等待1分30秒怎么解決

    VM虛擬機(jī)開機(jī)時(shí)多出1分30秒的解決方案
    發(fā)表于 10-30 08:36

    Java虛擬機(jī)介紹

    什么是JVM?Java虛擬機(jī)Java Virtual Machine, JVM)實(shí)際上是一個(gè)類似于真實(shí)計(jì)算機(jī)系統(tǒng)的抽象機(jī)(Abstract Computing Machine),它擁
    發(fā)表于 04-10 16:15 ?0次下載

    Java虛擬機(jī)向ARM平臺(tái)的移植

    介紹Java 虛擬機(jī)的概念,以常用的KVM 為例,講述了將Java 虛擬機(jī)移植到ARM 平臺(tái)的方法,重點(diǎn)介紹了移植過程中的編譯選項(xiàng)。
    發(fā)表于 09-23 11:54 ?38次下載

    Java虛擬機(jī)向ARM平臺(tái)的移植

    介紹Java 虛擬機(jī)的概念,以常用的KVM 為例,講述了將Java 虛擬機(jī)移植到ARM 平臺(tái)的方法,重點(diǎn)介紹了移植過程中的編譯選項(xiàng)。
    發(fā)表于 09-23 11:54 ?22次下載

    微軟java虛擬機(jī)下載

    微軟java虛擬機(jī)下載:Java虛擬機(jī)(JVM)是Java Virtual Machine的縮寫,它是一個(gè)虛構(gòu)出來的計(jì)算機(jī),是通過在實(shí)際的計(jì)
    發(fā)表于 02-26 08:26 ?38次下載

    VM虛擬機(jī)詳細(xì)使用安裝教程

    VM虛擬機(jī)詳細(xì)使用安裝教程
    發(fā)表于 07-30 16:16 ?0次下載

    Java虛擬機(jī)基礎(chǔ)

    JVM基礎(chǔ)----java虛擬機(jī)的學(xué)習(xí)內(nèi)容。
    發(fā)表于 10-30 10:21 ?0次下載

    深入JAVA虛擬機(jī)

    深入JAVA虛擬機(jī)
    發(fā)表于 03-19 11:24 ?1次下載

    JAVA虛擬機(jī)的體系結(jié)構(gòu)及基本類型

    包含在被裝載類的方法中的指令。 當(dāng)JAVA虛擬機(jī)運(yùn)行一個(gè)程序時(shí),它需要內(nèi)存來存儲(chǔ)許多東西,例如:字節(jié)碼、已裝載的class文件中得到的其他信息、程序創(chuàng)建的對(duì)象、傳遞給方法的參數(shù),返回值、局部變量等等。
    發(fā)表于 09-27 11:30 ?0次下載
    <b class='flag-5'>JAVA</b><b class='flag-5'>虛擬機(jī)</b>的體系結(jié)構(gòu)及基本類型

    Java虛擬機(jī)參數(shù)調(diào)優(yōu)

    隨著JAVA在應(yīng)用系統(tǒng)級(jí)的項(xiàng)目開發(fā)中的使用越來越廣泛,虛擬機(jī)、垃圾收集、熱點(diǎn)編譯、J2EE等新技術(shù)層出不窮,JAVA作為系統(tǒng)級(jí)開發(fā)的一個(gè)選擇的優(yōu)勢(shì)也越來越明顯,在此同時(shí)其不能完全編譯、垃圾收集等與生
    發(fā)表于 04-03 11:29 ?1次下載

    由淺入深的了解Java虛擬機(jī)

    說到Java虛擬機(jī),相信作為Java程序員的小伙伴們都不陌生,他們每天都在寫Java代碼,寫的代碼都是在一個(gè)叫做Java
    的頭像 發(fā)表于 01-01 17:50 ?2470次閱讀

    Java:JVM虛擬機(jī)的入門知識(shí)

    Java開發(fā)現(xiàn)在面試越來越難了,進(jìn)大廠必備的JVM、多線程高并發(fā)這都是最基礎(chǔ)的知識(shí)了,今天我們一起來學(xué)習(xí)Java虛擬機(jī)入門。
    的頭像 發(fā)表于 07-01 11:43 ?2439次閱讀
    <b class='flag-5'>Java</b>:JVM<b class='flag-5'>虛擬機(jī)</b>的入門知識(shí)

    Java虛擬機(jī)發(fā)展史:深入理解Java虛擬機(jī)

    1996年初sun公司發(fā)布的jdk1.0中所包含的sun Classic VM到今天,曾經(jīng)涌現(xiàn)或消失過許多經(jīng)典和特色的虛擬機(jī)出現(xiàn)。Classic VM只能使用純編輯器來執(zhí)行。如果要使
    的頭像 發(fā)表于 07-01 11:57 ?2399次閱讀