国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JVM字節(jié)碼初探

2019-11-11 04:39:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

字節(jié)碼格式

字節(jié)碼是JVM的機(jī)器語(yǔ)言。JVM加載類文件時(shí),對(duì)類中的每個(gè)方法,它都會(huì)得到一個(gè)字節(jié)碼流。這些字節(jié)碼流保存在JVM的方法區(qū)中。在程序運(yùn)行過(guò)程中,當(dāng)一個(gè)方法被調(diào)用時(shí),它的字節(jié)碼流就會(huì)被執(zhí)行。根據(jù)特定JVM設(shè)計(jì)者的選擇,它們可以通過(guò)解釋的方式,即時(shí)編譯(Just-in-time compilation)的方式或其他技術(shù)的方式被執(zhí)行。

方法的字節(jié)碼流就是JVM的指令(instruction)序列。每條指令包含一個(gè)單字節(jié)的操作碼(opcode)和0個(gè)或多個(gè)操作數(shù)(Operand)。操作碼指明要執(zhí)行的操作。如果JVM在執(zhí)行操作前,需要更多的信息,這些信息會(huì)以0個(gè)或多個(gè)操作數(shù)的方式,緊跟在操作碼的后面。

每種類型的操作碼都有一個(gè)助記符(mnemonic)。類似典型的匯編語(yǔ)言風(fēng)格,java字節(jié)碼流可以用它們的助記符和緊跟在后面的操作數(shù)來(lái)表示。

字節(jié)碼指令集被設(shè)計(jì)的很緊湊。除了處理跳表的2條指令以外,所有的指令都以字節(jié)邊界對(duì)齊。操作碼的總數(shù)很少,一個(gè)字節(jié)就能搞定。這最小化了JVM加載前,通過(guò)網(wǎng)絡(luò)傳輸?shù)念愇募拇笮。灰彩沟肑VM可以維持很小的實(shí)現(xiàn)。

JVM中,所有的計(jì)算都是圍繞棧(stack)而展開(kāi)的。因?yàn)镴VM沒(méi)有存儲(chǔ)任意數(shù)值的寄存器(register),所有的操作數(shù)在計(jì)算開(kāi)始之前,都必須先壓入棧中。因此,字節(jié)碼指令主要是用來(lái)操作棧的。例如,在上面的字節(jié)碼序列中,通過(guò)iload_0先把本地變量(local variable)入棧,然后用iconst_2把數(shù)字2入棧的方式,來(lái)計(jì)算本地變量乘以2。兩個(gè)整數(shù)都入棧之后,imul指令有效的從棧中彈出它們,然后做乘法,最后把運(yùn)算結(jié)果壓入棧中。istore_0指令把結(jié)果從棧頂彈出,保存回本地變量。JVM被設(shè)計(jì)成基于棧,而不是寄存器的機(jī)器,這使得它在如80486寄存器架構(gòu)不佳的處理器上,也能被高效的實(shí)現(xiàn)。

原始類型(PRimitive types)

JVM支持7種原始數(shù)據(jù)類型。Java程序員可以聲明和使用這些數(shù)據(jù)類型的變量,而Java字節(jié)碼,處理這些數(shù)據(jù)類型。下表列出了這7種原始數(shù)據(jù)類型:

類型定義
byte單字節(jié)有符號(hào)二進(jìn)制補(bǔ)碼整數(shù)
short2字節(jié)有符號(hào)二進(jìn)制補(bǔ)碼整數(shù)
int4字節(jié)有符號(hào)二進(jìn)制補(bǔ)碼整數(shù)
long8字節(jié)有符號(hào)二進(jìn)制補(bǔ)碼整數(shù)
float4字節(jié)IEEE 754單精度浮點(diǎn)數(shù)
double8字節(jié)IEEE 754雙精度浮點(diǎn)數(shù)
char2字節(jié)無(wú)符號(hào)Unicode字符

原始數(shù)據(jù)類型以操作數(shù)的方式出現(xiàn)在字節(jié)碼流中。所有長(zhǎng)度超過(guò)1字節(jié)的原始類型,都以大端(big-endian)的方式保存在字節(jié)碼流中,這意味著高位字節(jié)出現(xiàn)在低位字節(jié)之前。例如,為了把常量值256(0x0100)壓入棧中,你可以用sipush操作碼,后跟一個(gè)短操作數(shù)。短操作數(shù)會(huì)以“01 00”的方式出現(xiàn)在字節(jié)碼流中,因?yàn)镴VM是大端的。如果JVM是小端(little-endian)的,短操作數(shù)將會(huì)是“00 01”。

字節(jié)碼基本準(zhǔn)則

1.字長(zhǎng)是根據(jù)JVM不同而定的,一般(并非一定)在32位機(jī)上是4個(gè)字節(jié),64位機(jī)上是8個(gè)字節(jié)(使用8個(gè)字節(jié)很可能會(huì)潛在地存在內(nèi)存浪費(fèi)的情況),JVM規(guī)范上要求1個(gè)字必須至少能容納integer型的值(4字節(jié)),2個(gè)字必須至少能容納long型的值(8個(gè)字節(jié))。JVM有不少定義會(huì)以字為單位,譬如reference(引用)、本地變量和棧2.JVM操作由操作碼和操作數(shù)組成,操作碼是1字節(jié)的,因此最多只有256個(gè)操作碼,操作數(shù)從0-n個(gè)字節(jié)不等(0表示沒(méi)有操作數(shù),一般是指令參數(shù)通過(guò)操作棧來(lái)獲取,n不定,譬如像TABLESWITCH和LOOKUPSWITCH指令),即指令=操作碼+操作數(shù)3.每個(gè)操作如果需要從操作棧中讀參數(shù),則總是將這些參數(shù)出棧,如果操作有結(jié)果結(jié)果,總是會(huì)將結(jié)果入棧,后面可能會(huì)重復(fù)提到一點(diǎn),如果沒(méi)有提到,這是一個(gè)參考準(zhǔn)則4本地變量是以字為單位(如上,32位機(jī)一般是4個(gè)字節(jié),也有一些64位的JVM字長(zhǎng)是8個(gè)字節(jié))為單位的,即使值是byte或short,對(duì)于long、double型的數(shù)據(jù),在本地變量區(qū)中會(huì)占用2個(gè)位置(slot)5.操作棧是以字為單位(如上,32位機(jī)一般是4個(gè)字節(jié)) ,即使值是byte或short,而對(duì)于long、double型的數(shù)據(jù),在操作棧中會(huì)占用2個(gè)位置(slot)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 莱芜市| 湘潭市| 灵丘县| 湛江市| 宝清县| 富平县| 恭城| 比如县| 郑州市| 工布江达县| 津市市| 富源县| 和田市| 水富县| 娄烦县| 宾川县| 苍梧县| 栖霞市| 东辽县| 白河县| 衡阳市| 宝鸡市| 旌德县| 田阳县| 罗定市| 林口县| 双流县| 永寿县| 营山县| 班戈县| 宜城市| 鹤壁市| 兰溪市| 北安市| 镇远县| 扶余县| 营口市| 柳河县| 温州市| 全州县| 广德县|