老馬的JVM筆記(三)----類文件結構

序:這一節可能過於硬核。雖說可以讓人更理解Java,但可能實用性不強。


爲了實現平臺無關性,將Java應用到各個平臺,需要將Java編譯成一種各平臺都能使用的“程序存儲格式”---字節碼(ByteCode)。存儲形式就是常見的.class文件。各種JVM支持的語言文件都要編譯成.class文件才能在JVM上運行。

本節旨在分析.class文件中的內容。

3.1 Class文件結構

.class文件中,字節碼以8個字節爲基本單位,不需要分隔符,緊湊地排列在一起。所以分割就是8個8個分。文件中爲各種“屬性”的具體信息,每個屬性的長度都不一樣,但依然保證每組不超過8字節。

3.1.1 Magic Number

Magic Number用於標識該.class文件是真實能夠被JVM接受的文件。防止惡意篡改文件擴展名。.class文件使用的Magic Number爲0xCAFEBABE。其他類型的文件也會有自己的Magic Number。緊跟着Magic Number的爲該文件使用的JDK版本。

3.1.2 常量池

雖然.class文件中單位爲8個字節,但它依然可以存放表,只要長度被定下來。長度被存放在constant_pool_count中,從1開始數。常量池用於存放字面量(literal)(就是聲明的變量值,=右邊的部分),符號引用(Symbolic References)(類和接口的全限定名,字段的名稱和描述符,方法的名稱和描述符)。具體而言,每個類型(int,String,Class...)的格式都不同,緊跟的表就會不同。這裏沒有必要全部列一遍。

3.1.3 訪問標誌

訪問標誌(access_flag)跟在常量池後,標識當前類或接口的訪問信息。訪問信息,就是修飾這個類或接口的一些限定詞。Public,final,interface,abstract...

去世了,剛纔寫了一大堆,在圖書館睡着了,然後電腦自動註銷了。以往csdn都會自動保存,偏偏這次沒有。本來就不是很重要,不會重寫了。

3.2 字節碼指令

JVM指令:Opcode+Operands。Opcode長度爲1Byte,所以最多只能有2^8=256中Opcode。需要Java省吃儉用地找出這麼多精華的操作碼。操作碼還要自帶操作數的類型,所以理論需要很多,但能力又有限。所以load可以有iload(load int型),fload(load float型)等,很多類型會被模糊掉變成int(例如boolean)。

而已有的Opcode的能力其實很多。加載存儲(load系列),運算指令(add,sub系列),類型轉換,對象創建(new),訪問(getfiled),操作數棧管理(pop,dup),控制轉移(操作程序控制流,ifeq,goto),方法調用(invoke系列),返回(return系列),異常處理(throw/catch),同步(moniter系列)。

屬實可惜。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章