歡迎訪問昆山寶鼎軟件有限公司網站! 設為首頁 | 網站地圖 | XML | RSS訂閱 | 寶鼎郵箱 | 后臺管理
?

新聞資訊

MENU

軟件開發知識

astore 指令使用的操作 勞務派遣管理系統 數類型是一個 returnAddress

點擊: 次  來源:寶鼎軟件 時間:2017-10-07

原文出處: lwenkun

媒介

Java 虛擬機的內存模子分為兩部門:一部門是線程共享的,包羅 Java 堆和要領區;另一部門是線程私有的,包羅虛擬機棧和當處所法棧,以及措施計數器這一小部門內存。本日我就 Java 虛擬機棧做一些較量淺的探究。

熟悉 Java 的同學應該都知道了,JVM 是基于棧的??墒沁@個“?!?詳細指的是什么?莫非就是虛擬機棧?想要答復這個問題我們先要從虛擬機棧的布局談起。

虛擬機棧

作甚虛擬機棧

虛擬機棧的棧元素是棧幀,當有一個要領被挪用時,代表這個要領的棧幀入棧;當這個要領返回時,其棧幀出棧。因此,虛擬機棧中棧幀的入棧順序就是要領挪用順序。什么是棧幀呢?棧幀可以領略為一個要領的運行空間。它主要由兩部門組成,一部門是局部變量表,要領中界說的局部變量以及要領的參數就存放在這張表中;另一部門是操縱數棧,用來存放操縱數。我們知道,Java 措施編譯之后就釀成了一條條字節碼指令,其形式雷同匯編,但和匯編有差異之處:匯編指令的操縱數存放在數據段和寄存器中,圖紙加密,可通過存儲器或寄存器尋址找到需要的操縱數;而 Java 字節碼指令的操縱數存放在操縱數棧中,當執行某條帶 n 個操縱數的指令時,就從棧頂取 n 個操縱數,然后把指令的計較功效(假如有的話)入棧。因此,當我們說 JVM 執行引擎是基于棧的時候,個中的“?!敝傅木褪遣倏v數棧。舉個簡樸的例子比擬下匯編指令和 Java 字節碼指令的執行進程,好比計較 1 + 2,在匯編指令是這樣的:

mov ax, 1 ;把 1 放入寄存器 ax
add ax, 2 ;用 ax 的內容和 2 相加后存入 ax

而 JVM 的字節碼指令是這樣的:

iconst_1 //把整數 1 壓入操縱數棧
iconst_2 //把整數 2 壓入操縱數棧
iadd //棧頂的兩個數相加后出棧,功效入棧

由于操縱數棧是內存空間,所以字節碼指令不必擔憂差異呆板上寄存器以及呆板指令的不同,從而做到了平臺無關。

留意,局部變量表中的變量不行直接利用,如需利用必需通過相關指令將其加載至操縱數棧中作為操縱數利用。好比有一個要領 void foo(),個中的代碼為:int a = 1 + 2; int b = a + 3;,編譯為字節碼指令就是這樣的:

iconst_1 //把整數 1 壓入操縱數棧
iconst_2 //把整數 2 壓入操縱數棧
iadd //棧頂的兩個數出棧后相加,功效入棧;實際上前三步會被編譯器優化為:iconst_3
istore_1 //把棧頂的內容放入局部變量表中索引為 1 的 slot 中,也就是 a 對應的空間中
iload_1 // 把局部變量表索引為 1 的 slot 中存放的變量值(3)加載至操縱數棧
iconst_3 
iadd //棧頂的兩個數出棧后相加,功效入棧
istore_2 // 把棧頂的內容放入局部變量表中索引為 2 的 slot 中,也就是 b 對應的空間中
return // 要領返回指令,回到挪用點

需要說明的是,局部變量表以及操縱數棧的容量的最大值在編譯時就已經確定了,運行時不會改變。而且局部變量表的空間是可以復用的,譬喻,當指令的位置超出結局部變量表中某個變量 a 的浸染域時,假如有新的局部變量 b 要被界說,b 就會包圍 a 在局部變量表的空間。

盜用別人的圖以讓各人對虛擬機棧有個直觀的認識(個中小字體 Stack 指的的是虛擬機棧,Frame 是棧幀,Local variables 是局部變量表,Operand Stack 是操縱數棧):

astore 指令利用的操縱 勞務調派打點系統 數范例是一個 returnAddress

虛擬機棧

由虛擬機棧引出的問題

看完上面的代碼各人大概會有幾點迷惑:什么是 slot?那些指令是什么意思?為什么 a 對應的 slot 的索引值不是從零開始的,它顯著是第一個界說的變量???

對付這些問題我們一個個來辦理。

什么是 slot

首先什么是 slot?slot 是局部變量表中的空間單元,虛擬機類型中有劃定,對付 32 位之內的數據,用一個 slot 來存放,如 int,short,float 等;對付 64 位的數據用持續的兩個 slot 來存放,如 long,double 等。引用范例的變量 JVM 并沒有劃定其長度,它大概是 32 位,也有大概是 64 位的,所以既有大概占一個 slot,也有大概占兩個 slot。

JVM 字節碼指令

第二個問題,那些指令是什么意思?

指令名目

首先我們要領略 Java 指令的名目,Java 的指令以字節為單元,也就是一個字節代表一條指令。好比 iconst_1 就是一條指令,它占一個字節,那么自然 Java 指令不會高出 256 條。實際上 Java 指令今朝界說了 200 多條。指令固然是一個字節,可是它也可以帶本身的操縱數。JVM 中有這樣一條指令 putstatic,其浸染是給特定的的靜態字段賦值??墒墙o哪個字段賦值呢?僅僅通過這條指令并不能說明,那么只有通過操縱數來指定了。緊跟在 putstatic 后頭的兩個字節就是它的操縱數,這個操縱數是一個索引值,指向運行時常量池中該靜態字段對應的標記引用。由于標記引用包括了該字段的根基信息,如所屬類、簡樸名稱以及描寫符,因此 putstatic 指令就知道是給哪個類的哪個字段賦值了。

排列三305组选前后关系 南平靠谱炒股配资推荐 最新管家婆24码期期准 国防b最新股价 广东快乐十分一定牛预测号 pk10彩票 福建体彩11选5真准网 重庆快乐十分开奖结果查询一定牛前一 2014年2月19上证指数 极速pk10 广西体彩十一选5中奖规则