利用五一小假期,看了一下java的類class文件結構,在此記錄一下學習筆記。java
字節碼併發
程序的存儲格式。語言無關。學習
跨平臺。翻譯
class文件 — 概述對象
- 包含了Java虛擬機指令集和符號表,以及若干其餘輔助信息。
- class文件是一組以8位字節爲基礎單位的二進制流。大端方式存儲。
class文件 — 結構繼承
- 魔數、class文件的版本
魔數:肯定這個文件能被虛擬機接受。4個字節:0xCAFEBABE
版本:緊接着魔數後面。4個字節。
第五、6個字節標識次版本號。
第七、8個字節標識主版本號。
- 常量池
緊接着版本號,資源倉庫。
主要存放兩大類常量:字面量(文本字符串、聲明爲final的常量值等)、符號引用。
java代碼javac編譯,在虛擬機加載class文件時動態連接。
當虛擬機運行時,須要從常量池獲取對應的符號引用,再在類建立或運行時解析、翻譯到具體的內存地址中。
Java中若是定義超過64KB英文字符的變量或方法名,將沒法解析。
- 訪問標誌
用於識別一些類或接口層次的訪問信息。
好比public、final等。
- 類索引、父類索引、接口索引集合
用這三項數據來肯定這個類的繼承關係。
類索引:肯定這個類的全限定名。
父類索引:用於肯定這個類的父類的全限定名。
接口索引集合:用來描述這個類實現了哪些接口。
- 字段表集合
用於描述接口或者類中聲明的變量。
包括的信息:字段的做用域、實例變量仍是類變量、可變性、併發可見性、能否被序列化、字段數據類型、字段名稱。
- 方法表集合
對方法的描述,相似字段表集合。
方法裏的java代碼,存儲在「Code」屬性裏。
Java中,要重載一個方法,要求必須擁有一個與原方法不一樣的特徵簽名。
- 屬性表集合
在class文件、字段表、方法表中,均可以攜帶本身的屬性表集合,以用於描述某些場景專有的信息。
字節碼指令簡介索引
由一個字節長度的、表明着某種特定操做含義的數字、以及跟隨其後的0至多個表明此操做所需參數構成。接口
- 字節碼
大部分的指令都沒有支持byte、char、short,甚至徹底沒有boolean類型。編譯器會在編譯期或運行期將byte、short類型的數據帶符號擴展爲相應的int類型數據,將boolean和char類型數據零位擴展爲相應的int類型數據。
大多數對於boolean、byte、short、char類型數據的操做,實際上都是使用相應的int類型做爲運算類型。
- 加載和存儲指令
用於將數據在棧幀中的局部變量表和操做數棧之間來回傳輸。
- 運算指令
用於對兩個操做數棧上的值進行某種特定的運算,並把結果從新存入到操做棧頂。
分爲兩種:對整型數據進行運算的指令、對浮點型數據運算的指令。
舍入操做:向最接近數舍入模式。
- 類型轉換指令
將兩種不一樣的數值類型相互轉換。
寬化類型轉換、窄化類型轉換。
- 對象建立與訪問指令
new、newarray、getfield、putfield、baload、bastore、arraylength、instanceof等等。
- 操做數棧管理指令
pop、dup、swap等等。
- 控制轉移指令
在有條件或無條件地修改PC寄存器的值。
- 方法調用和返回指令
invokevirtual、invokeinterface、invokespecial、invokestatic、invokedynamic等
- 異常處理指令
顯示拋出異常:athrow;
虛擬機檢測到異常字段拋出:如ArithmeticException。
- 同步指令
使用管程來實現。
初步看完,有的地方仍是有點難理解,並且感受過段時間就會忘記。惟有往後不斷思考、複習來加深印象。內存