不論什麼class檔案都相對應唯一乙個類或介面的定義資訊,但不是全部的類或介面都得定義在檔案裡(它們也能夠通過類載入器直接生成)。
class檔案是一組以8位位元組為基礎單位的二進位製流。各個資料項嚴格按順序排列。
class檔案格式採用一種類似於c語言結構體的偽結構來儲存資料。這樣的偽結構僅僅有兩種資料型別:無符號數和表。
無符號數:是基本資料型別。以u1、u2、u4、u8分別代表1個位元組、2個位元組、4個位元組、8個位元組的無符號數,能夠用來描寫敘述數字、索引引用、數量值或者依照utf-8編碼構成的字串值。
表:由多個無符號數或者其它表作為資料項構成的復合資料型別。全部表都習慣性地以「_info」結尾。
整個class檔案本質上就是一張表,例如以下所看到的:
型別名稱
數量描述
u4magic1魔數
u2minor_version
1次版本號
u2major_version
1主版本號
u2constant_pool_count
1常量池計數器
cp_info
constant_pool
constant_pool_count-1
常量池u2
access_flags
1訪問標誌
u2this_class
1類索引
u2super_class
1父類索引
u2inte***ces_count
1介面計數器
u2inte***ces
inte***ces_count
介面索引集合
u2fields_count
1欄位計數器
field_info
fields
fields_count
字段表集合
u2methods_count
1方法計數器
method_info
methods
methods_count
方法表集合
u2attributes_count
1屬性計數器
attribute_info
attributes
attributes_count
屬性表集合
如下test類:
編譯後的class檔案如下:
2.2.1.1.魔數
每乙個class檔案的頭4個位元組稱為魔數,它唯一的作用是確定這個檔案是否為乙個能被虛擬機器接受的class檔案。
非常多檔案儲存標準中都使用魔數來進行身份識別。譬如格式gif、jpeg等。使用魔數而不是拓展名來進行識別主要是基於安全方面的考慮,由於檔案拓展格式能夠任意修改。
class檔案的魔數為:0xcafebabe。
2.2.1.2.版本
第五六個位元組是次版本(minor version)。第7和第8個位元組是主版本(major version)。
高版本號的jdk能夠向下相容曾經版本號的class檔案,可是無法執行以後版本號的class檔案,即使檔案格式並未發生變化,虛擬機器也必須拒絕執行超過其版本號號的class檔案。
常量池能夠理解為class檔案之中的資源倉庫,是class檔案結構中與其它專案關聯最多的資料型別,也是占用class檔案空間最大的資料專案之中的乙個。同一時候也是在class檔案裡第乙個出現的表型別資料專案。
2.2.1.3常量池
因為常量池中常量的數目是不固定的,所以在常量池入口須要放置乙個2位元組長的無符號數constatn_pool_count來代表常量池容量計數值。這個容量計數從1而不是0開始。
constant_pool_count:佔2位元組。0x0016。轉化為十進位制為22,即說明常量池中有21個常量(僅僅有常量池的計數是從1開始的,其他集合型別均從0開始),索引值為1~22。第0項常量具有特殊意義。假設某些指向常量池索引值的資料在特定情況下須要表達「不引用不論什麼乙個常量池專案」的含義,這樣的情況能夠將索引值置為0來表示
常量池中主要存放兩大類常量:字面量和符號引用。字面量如文字字串、宣告為final的常量值等(=號右邊資料)。符號引用包含三類常量:類和介面的全限定名、欄位的名稱和描寫敘述符、方法的名稱和描寫敘述符。
類和介面許可權定名:com.shx.test
欄位的名稱和描寫敘述符、方法的名稱和描寫敘述符:private、public、protected
常量池結構表:型別
簡單介紹 專案
型別描寫敘述
constant_utf8_info
utf-8
縮略編碼字串
tag u1
值為1
length u2
utf-8
縮略編碼字串占用位元組數
bytes u1
長度為length
的utf-8
縮略編碼字串
constant_integer_info
整形字面量
tag u1
值為3
bytes u4
依照高位在前儲存的
int值
constant_float_info
浮點型字面量
tag u1
值為4
bytes u4
依照高位在前儲存的
float值
constant_long_info
長整型字面量
tag u1
值為5
bytes u8
依照高位在前儲存的
long值
constant_double_info
雙精度浮點型字面量
tag u1
值為6
bytes u8
依照高位在前儲存的
double值
constant_class_info
類或介面的符號引用
tag u1
值為7
index u2
指向全限定名常量項的索引
constant_string_info
字串型別字面量
tag u1
值為8
index u2
指向字串字面量的索引
constant_fieldref_info
欄位的符號引用
tag u1
值為9
index u2
指向宣告欄位的類或介面描寫敘述符
constant_class_info
的索引項
index u2
指向字段描寫敘述符
constant_nameandtype_info
的索引項
constant_methodref_info
類中方法的符號引用
tag u1
值為10
index u2
指向宣告方法的類描寫敘述符
constant_class_info
的索引項
index u2
指向名稱及型別描寫敘述符
constant_nameandtype_info
的索引項
constant_inte***cemethodref_info
介面中方法的符號引用
tag u1
值為11
index u2
指向宣告方法的介面描寫敘述符
constant_class_info
的索引項
index u2
指向名稱及型別描寫敘述符
constant_nameandtype_info
的索引項
constant_nameandtype_info
欄位或方法的部分符號引用
tag u1
值為12
index u2
指向該字段或方法名稱常量項的索引
index u2
指向該字段或方法描寫敘述符常量項的索引
jvm虛擬機器
jvm虛擬機器 執行時資料 虛擬機器棧中每個執行緒單獨占有 xss引數大小的記憶體.乙個執行緒使用記憶體超出此引數則丟擲stackoverflowerror,比較常見的就是死迴圈.oom是在申請不到記憶體時,常見的就是建立很多執行緒.堆中記憶體所有執行緒共享.分為年輕代和老年代.年輕代gc一些大物件...
JVM虛擬機器查詢類檔案的順序
jvm查詢類檔案的順序 在doc下使用set classpath 如果沒有配置classpath環境變數,jvm只在當前目錄下查詢要執行的類檔案。如果配置了classpath環境,jvm會先在classpath環境變數值的目錄中查詢要執行的類檔案。值的結尾處如果加上分號,那麼jvm在classpat...
淺入理解JVM虛擬機器
1.類載入過程 驗證 準備 解析 初始化 驗證階段 判斷.class檔案符合規範標準 準備階段 給類以及靜態變數分配記憶體並給初始值 0 解析階段 維護哥哥字段,方法類的記憶體指標或偏移量 初始化階段 變數賦值 真實的值 執行 什麼時候乙個類會進行初始化階段?1.new乙個例項化物件時 2.包含ma...