BiBi - JVM -7- Java類文件結(jié)構(gòu)

From:深入理解Java虛擬機(jī)

Java虛擬機(jī)具有平臺(tái)無關(guān)【W(wǎng)indow蜕着、Mac】和語言無關(guān)【Groovy、JPython汽馋、JRuby】的特性侮东。Java虛擬機(jī)只與【Class文件】這種特定的二進(jìn)制文件格式關(guān)聯(lián),不與任何語言綁定豹芯。所有會(huì)有javac編譯器悄雅、groovyc編譯器、jrubyc編譯器等來產(chǎn)class文件铁蹈。

Class文件

Class文件是一組以8位字節(jié)【64位】為基礎(chǔ)單位的二進(jìn)制流宽闲,之間沒有添加任何分隔符。當(dāng)遇到需要占用8位字節(jié)以上空間的數(shù)據(jù)項(xiàng)時(shí)握牧,會(huì)按照高位在前的方式分割成若干個(gè)8位字節(jié)進(jìn)行存儲(chǔ)容诬。

Javap是一個(gè)專門用于分析Class文件字節(jié)碼的工具。

Class文件格式中只有兩種數(shù)據(jù)類型:無符號(hào)數(shù)和表沿腰。
無符號(hào):基本的數(shù)據(jù)類型览徒,u1 u2【2個(gè)字節(jié)】 u4 u8,無符號(hào)數(shù)可以用來描述:數(shù)字颂龙、索引引用习蓬、數(shù)量值、字符串值等措嵌。
表:是由多個(gè)無符號(hào)數(shù)構(gòu)成的復(fù)合數(shù)據(jù)類型躲叼,習(xí)慣以【_info】結(jié)尾。

當(dāng)需要描述一類型但數(shù)量不定的多個(gè)數(shù)據(jù)時(shí)企巢,會(huì)使用一個(gè)前置的容量計(jì)數(shù)器 + 若干這連續(xù)的數(shù)據(jù)項(xiàng)枫慷,稱這為某一類型的集合

Class文件結(jié)構(gòu)

  1. Class文件的頭4個(gè)字節(jié)【0xCAFFBABE,咖啡寶貝】稱為【魔數(shù)】或听,標(biāo)識(shí)該文件是否為一個(gè)能被虛擬機(jī)接受的Class文件探孝,即進(jìn)行身份驗(yàn)證。

  2. 緊接著魔數(shù)的4個(gè)字節(jié)標(biāo)識(shí)Class文件的版本號(hào):其中第5神帅、6字節(jié)是次版本號(hào)再姑;第7萌抵、8字節(jié)是主版本號(hào)【Java的版本號(hào)從45開始】找御。該信息主要是為了版本兼容,高版本的JDK能兼容低版本的Class文件绍填,但低版本的JDK不能運(yùn)行高版本的Class文件霎桅。

  3. 緊接著版本號(hào)之后的是常量池入口,由于數(shù)量不固定讨永,所以入口有一個(gè)u2類型的數(shù)據(jù)滔驶,代表常量池容量的計(jì)數(shù)值。如:0x0016卿闹,代表常量池中有21項(xiàng)常量揭糕。【只有常量池的索引從1開始】其中锻霎,第0項(xiàng)表示:不引用任何一個(gè)常量池的項(xiàng)目著角。常量池中主要存放兩大常量:字面常量和符號(hào)引用。

字面常量:文本字符串旋恼、final常量值吏口。
符號(hào)引用:類和接口的全限定名、字段的名稱和描述符冰更、方法的名稱和描述符产徊。

虛擬機(jī)加載Class文件是動(dòng)態(tài)連接的,即在Class文件中不會(huì)保存各個(gè)方法和字段的最終內(nèi)存布局信息蜀细,因此這些字段舟铜、方法的符號(hào)引用不經(jīng)過運(yùn)行期轉(zhuǎn)換,無法得到真正的內(nèi)存入口地址奠衔,也就無法直接被虛擬機(jī)使用谆刨。當(dāng)虛擬機(jī)運(yùn)行時(shí),需要從常量池獲得對(duì)應(yīng)的符號(hào)引用涣觉,再在類創(chuàng)建時(shí)或運(yùn)行時(shí)解析痴荐、翻譯到具體內(nèi)存地址之中。

  1. 緊接著的是:
    訪問標(biāo)志官册;
    類索引生兆、父類索引、接口索引集合;
    字段表集合鸦难;
    方法表集合根吁;
    屬性表集合『媳危【跟我們平時(shí)理解的「屬性」不是一回事】

字節(jié)碼指令

Java虛擬機(jī)規(guī)范描繪了Java虛擬機(jī)應(yīng)有的共同程序存儲(chǔ)格式:Class文件格式和字節(jié)碼指令集击敌。Java虛擬機(jī)的指令由一個(gè)字節(jié)【8位】長度的,代表著某種特定操作含義的數(shù)字【操作碼】以及跟隨其后的零至多個(gè)代表此操作所需參數(shù)【操作數(shù)】而構(gòu)成拴事。

Java虛擬機(jī)采用面向操作數(shù)棧而不是寄存器的架構(gòu)沃斤,所以大多數(shù)的指令都不包含操作數(shù),只有一個(gè)操作碼刃宵。在Java虛擬機(jī)的指令集中衡瓶,大多數(shù)的指令都包含了其操作所對(duì)應(yīng)的數(shù)據(jù)類型信息。如:iload牲证、fload哮针。

  • 加載和存儲(chǔ)指令
  • 運(yùn)算指令
  • 類型轉(zhuǎn)換指令
  • 對(duì)象創(chuàng)建與訪問指令
  • 操作數(shù)棧管理指令
  • 控制轉(zhuǎn)移指令
  • 方法調(diào)用和返回指令
  • 異常處理指令
  • 同步指令
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坦袍,隨后出現(xiàn)的幾起案子十厢,更是在濱河造成了極大的恐慌,老刑警劉巖捂齐,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛮放,死亡現(xiàn)場離奇詭異,居然都是意外死亡辛燥,警方通過查閱死者的電腦和手機(jī)筛武,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挎塌,“玉大人徘六,你說我怎么就攤上這事×穸迹” “怎么了待锈?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘴高。 經(jīng)常有香客問我竿音,道長,這世上最難降的妖魔是什么拴驮? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任春瞬,我火速辦了婚禮,結(jié)果婚禮上套啤,老公的妹妹穿的比我還像新娘宽气。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般楞黄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枣察,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音燃逻,去河邊找鬼序目。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唆樊,可吹牛的內(nèi)容都是我干的宛琅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼逗旁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舆瘪?” 一聲冷哼從身側(cè)響起片效,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎英古,沒想到半個(gè)月后淀衣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡召调,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年膨桥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唠叛。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡只嚣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艺沼,到底是詐尸還是另有隱情册舞,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布障般,位于F島的核電站调鲸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挽荡。R本人自食惡果不足惜藐石,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望定拟。 院中可真熱鬧于微,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至勺三,卻和暖如春雷滚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吗坚。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工祈远, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人商源。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓车份,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牡彻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扫沼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355