jvm虛擬機器 1 class檔案解析

2021-09-06 20:35:02 字數 4266 閱讀 5122

不論什麼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...