日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
圖解JVM整體結(jié)構(gòu)、執(zhí)行流程以及兩種架構(gòu)模型,你學(xué)會了嗎?

圖解JVM整體結(jié)構(gòu)、執(zhí)行流程以及兩種架構(gòu)模型,你學(xué)會了嗎?

作者:Android開發(fā)Alvin老師 2021-10-26 17:26:46
云計算
虛擬化 Java 編譯器輸入的指令流基本上是一種基于棧的指令集架構(gòu),另外一種指令集架構(gòu)則是基于寄存器的指令集架構(gòu)。

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、晉城ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的晉城網(wǎng)站制作公司

 JVM整體結(jié)構(gòu) 

  • HotSpot VM 是目前市面上高性能虛擬機的代表作之一。
  • 方法區(qū)和堆:多線程共享
  • 虛擬機棧、本地方法棧、程序計數(shù)器:每個線程獨有一份
  • 執(zhí)行引擎:包含三部分:解釋器,及時編譯器(后端編譯器),垃圾回收器
  • 它采用解釋器與即時編譯器并存的架構(gòu)。
  • 在今天,Java 程序的運行性能早已脫胎換骨,已經(jīng)達到了可以和 C/C++ 程序一較高下的地步。 

Java 代碼執(zhí)行流程 

只是能生成被 Java 虛擬機所能解釋的字節(jié)碼文件,那么理論上就可以自己設(shè)計一套代碼了

解釋器:保證相應(yīng)時間,負(fù)責(zé)解釋執(zhí)行的速度

JIT編譯器:負(fù)責(zé)編譯的性能,針對字節(jié)碼指令,熱點代碼,放在方法區(qū)緩存起來,下次遇見直接變成二進制指令

JVM 的架構(gòu)模型

Java 編譯器輸入的指令流基本上是一種基于棧的指令集架構(gòu),另外一種指令集架構(gòu)則是基于寄存器的指令集架構(gòu)。

具體來說:這兩種架構(gòu)之間的區(qū)別:

基于棧式架構(gòu)

  • 設(shè)計和實現(xiàn)更簡單,適用于資源受限的系統(tǒng);
  • 避開了寄存器的分配難題:使用零地址指令方式分配。
  • 指令流中的指令大部分是零地址指令,其執(zhí)行過程依賴于操作棧。指令集更小,編譯器容易實現(xiàn)。
  • 不需要硬件支持,可移植性更好,更好實現(xiàn)跨平臺

基于寄存器架構(gòu)

  • 典型的應(yīng)用是 x86 的二進制指令集:比如傳統(tǒng)的 PC 以及 Android 的 Davlik 虛擬機。
  • 指令集架構(gòu)則完全依賴硬件,可移植性差
  • 性能優(yōu)秀和執(zhí)行更高效
  • 花費更少的指令去完成一項操作。
  • 在大部分情況下,基于寄存器架構(gòu)的指令集往往都以一地址指令、二地址指令和三地址指令為主,而基于棧式架構(gòu)的指令集卻是以零地址指令為主

舉例

同樣執(zhí)行2+3這種邏輯操作,其指令分別如下:

基于棧的計算流程(以Java虛擬機為例):

  
 
 
 
  1. iconst_2 // 常量2入棧 
  2. istore_1 
  3. iconst_3 // 常量3入棧 
  4. istore_2 
  5. iload_1 
  6. iload_2 
  7. iadd    //常量2/3出棧,執(zhí)行相加 
  8. istore_0 // 結(jié)果5入棧 

而基于寄存器的計算流程

  
 
 
 
  1. mov eax,2 //將eax寄存器的值設(shè)為 
  2. 1add eax,3 //使eax寄存器的值加3 

字節(jié)碼反編譯

我們編寫一個簡單的代碼,然后查看一下字節(jié)碼的反編譯后的結(jié)果

  
 
 
 
  1. public class StackStruTest { 
  2.   public static void main(String[] args) { 
  3.     int i = 2 + 3; 
  4.   } 

然后我們找到編譯后的 class 文件,使用下列命令進行反編譯

  
 
 
 
  1. javap -v(verbose) StackStruTest.class 

得到的文件為:

  
 
 
 
  1. public static void main(java.lang.String[]); 
  2.     descriptor: ([Ljava/lang/String;)V 
  3.     flags: ACC_PUBLIC, ACC_STATIC 
  4.     Code: 
  5.       stack=2, locals=4, args_size=1 
  6.          0: iconst_2 
  7.          1: istore_1 
  8.          2: iconst_3 
  9.          3: istore_2 
  10.          4: iload_1 
  11.          5: iload_2 
  12.          6: iadd 
  13.          7: istore_3 
  14.          8: return 
  15.       LineNumberTable: 
  16.         line 9: 0 
  17.         line 10: 2 
  18.         line 11: 4 
  19.         line 12: 8 
  20.       LocalVariableTable: 
  21.         Start  Length  Slot  Name   Signature 
  22.             0       9     0  args   [Ljava/lang/String; 
  23.             2       7     1     i   I 
  24.             4       5     2     j   I 
  25.             8       1     3     k   I 
  26.   

總結(jié)

由于跨平臺性的設(shè)計,Java 的指令都是根據(jù)棧來設(shè)計的。

不同平臺 CPU 架構(gòu)不同,所以不能設(shè)計為基于寄存器的。

優(yōu)點是跨平臺,指令集小,編譯器容易實現(xiàn)

缺點是性能下降,實現(xiàn)同樣的功能需要更多的指令。

時至今日,盡管嵌入式平臺已經(jīng)不是 Java 程序的主流運行平臺了(準(zhǔn)確來說應(yīng)該是 HotSpotVM 的宿主環(huán)境已經(jīng)不局限于嵌入式平臺了),那么為什么不將架構(gòu)更換為基于寄存器的架構(gòu)呢?

總結(jié):因為已經(jīng)夠用了

跨平臺性

指令集小

指令多

執(zhí)行性能比寄存器差


文章名稱:圖解JVM整體結(jié)構(gòu)、執(zhí)行流程以及兩種架構(gòu)模型,你學(xué)會了嗎?
URL鏈接:http://www.dlmjj.cn/article/cdpshsp.html