jvm原理(26)位元組碼訪問標誌與欄位表詳解
先看一下java位元組碼的結構:
圖1:
圖2:
圖3:
- Class位元組碼中有2中資料結構
- 位元組資料直接量:這是基本的資料型別。共細分為u1、u2、u4、u8四種,分別代表連續的1個位元組
、2個位元組、四個位元組、8個位元組組成的整體資料。 表(陣列):表示由多個基本資料或其他表,按照既定順序組成的大的資料集合。表是有結構的,
它的結構體現在:組成表的成分所在的位置和順序都是已經嚴格定義好的。
圖4:
上面的表中描述了11種資料型別的結構,其實在jdk1.7之後又增加了3種(CONSTANT_Method_info\CONSTANT_Method_Type\CONSTANT_InvokeDynamic_info).
這樣一共是14種。
Access_Flag訪問標誌
訪問標誌資訊包括該Class檔案是類還是介面,是否被定義成public,是否是abstract,如果是類
是否被宣告成final,通過上面的原始碼(MyTest1),我們知道該檔案是類並且是public。
圖5:
那接下來看一下access_flag:
圖6:
從00 21 開始就是訪問修飾符:00 21 我們去圖5裡邊找不到,那是因為00 21是由0x0001|0x0020=0x0021得到的,即,java不會窮舉所有的訪問修飾組合,而是用並集的方式得到的。當前表示我們的MyTest1是一個acc_public和acc_super。
然後是this Class Name,也是佔據2個位元組:00 03(十進位制3) :對應的是常量池裡邊的3號常量:
【#3 = Class #22 // com/twodragonlake/jvm/bytecode/MyTest1】
接下來是父類的名字,佔2個位元組,00 04 (十進位制4),指向的是常量池的4號常量:【#4 = Class #23 // java/lang/Object】
介面:當前MyTest1沒有實現人很介面,所以說介面的數量是0,即:00 00 所以介面表就不會再出現了。
成員變數:由成員變數數量加成員變量表組成。成員變數數量:00 01 (十進位制,即一個成員變數),然後是成員變量表:00 02 (十進位制2,即常量池的2號常量):
【#2 = Fieldref #3.#21 // com/twodragonlake/jvm/bytecode/MyTest1.a:I】
欄位表集合重點內容
欄位表用於描述類和介面中宣告的變數。
這裡的欄位包含了類級別變數以及例項變數,但是不包括方法內部宣告的區域性變數。
型別 | 名稱 | 數量 |
---|---|---|
u2 | access_flags | 1 |
u2 | name_index | 1 |
u2 | descriptor_index | 1 |
u2 | attributes_count | 1 |
u2 | attributes | 1 |
圖7:
所以接下里的00 01 表示的就是屬性表的數量,此處表示由有一個欄位,然後數量之後是訪問標示: 00 02 ,00 02 在圖5裡邊沒有列出,表示的是私有的private。
緊接著是名字的索引和描述符的索引: 00 05 00 06 分別指向的是常量池的:
[#5 = Utf8 a]
[#6 = Utf8 I ]
然後是attributes_count : 00 00 是0個,所以attributes表就不會出現。
ok,欄位資訊,到此梭哈完畢,下一章搞一下方法表。
相關推薦
jvm原理(26)位元組碼訪問標誌與欄位表詳解
先看一下java位元組碼的結構: 圖1: 圖2: 圖3: Class位元組碼中有2中資料結構 位元組資料直接量:這是基本的資料型別。共細分為u1、u2、u4、u8四種,分別代表連續的1個位元組 、2個位元組、四個位元組、8個位元組組成的
(16)zabbix history trends歷史與趨勢數據詳解
history 存儲 其中 均值 span 類型 col ask zabbix 1. 保留歷史數據 我們可以通過如下方式來設置保留數據的時長:監控項(item)配置裏匹配更新監控項(item)設置Housekeeper tasksHousekeeper會定期刪除過期的數據
第11課:jvm的gc日誌young Generation下minor GC每個欄位徹底詳解
內容: 1.演示Minor GC 2.徹底分析Minor GC的每一個欄位 一、演示Minor GC [GC (Allocation Failure) [PSYoungGen:
jvm原理(27)Java位元組碼方法表與屬性表深度剖析
上一節說到成員變數,這一節說一下方法表 圖一: 圖二: 圖三: 行號00000120 開始就是方法表的開始,剛開始2個位元組是方法的數量:00 03 是三個方法(無參構造器、變數a的get和set方法) 方法表: 型別 名稱
jvm原理(29)構造方法與靜態程式碼塊位元組碼指令詳解
上一節解析完了常量池,接下來是訪問標記, 00 21 : ACC_SUPPER + ACC_PUBLIC 緊接著是類的名字,2個位元組:00 05 是5號常量 【#5 = Class #49 // co
深入理解JVM(八)——位元組碼執行引擎
不用虛擬機器,執行引擎在執行Java程式碼時,會有解釋執行(通過直譯器執行)和編譯執行(通過及時編譯器產生原生代碼執行)兩種選擇。 執行時棧幀結構 棧幀用於支援虛擬機器進行方法呼叫和方法執行的資料結構。棧幀儲存了方法的區域性變量表,運算元棧,動態連線和方法返回地址等資訊。每一個方法從
JVM原理(二)類載入機制與GC演算法
一. 類的載入機制 過程 將.class的二進位制資料讀入記憶體,放入方法區中 在堆中建立一個java.lang.Class物件,封裝類在方法區中的資料結構,並提供訪問方法區資料結構的介面 類的生命週期 類的載入過程
挑戰408——組成原理(3)——原碼,補碼,反碼
計算機中的資料分為數值資料和非數值型資料(如聲音,影象等等)。我們接下來主要談的是數值型資料。 在現實的生活中,數值資料主要分為實數和整數兩大類,在計算機中,整數用定點數表示,實數用浮點數表示,而所有帶符號的整形都用補碼錶示。目前通用計算機中浮點數大多數採用IEEE754標準,其中尾數採
深入理解java虛擬機器(六)位元組碼指令簡介
Java虛擬機器指令是由(佔用一個位元組長度、代表某種特定操作含義的數字)操作碼Opcode,以及跟隨在其後的零至多個代表此操作所需引數的稱為運算元 Operands 構成的。由於Java虛擬機器是面向運算元棧而不是暫存器的架構,所以大多數指令都只有操作碼,而沒有運算元。 位元組碼指令集是一種具有鮮明特點、
jvm原理(34)虛方法表與動態分派機制詳解
編寫程式碼: public class MyTest7 { public static void main(String[] args) { Animal animal = new Animal(); Animal
Java位元組碼詳解(三)位元組碼指令(轉)
一、概述 Java虛擬機器採用基於棧的架構,其指令由操作碼和運算元組成。 操作碼:一個位元組長度(0~255),意味著指令集的操作碼個數不能操作256條。 運算元:一條指令可以有零或者多個運算元,且運算元可以是1個或者多個位元組。編譯後的程式碼沒有采用運算元長
深入JVM 原理(五)Java堆記憶體調整引數(調優關鍵)
目錄 堆記憶體的引數調整 通過之前的分析可以發現,實際上每一塊子記憶體區中都會存在有一部分的可變伸縮區,其基本流程: 如果空間不足,在可變的範圍之內擴大記憶體空間,當一段時間之後發現記憶體空間沒有這麼緊張的時候,再將可變空間進行釋放。所以在整個調整
深入JVM 原理(七)老年代、永久代和元空間
目錄 老年代 老年代主要接收由年輕代傳送過來的物件,一般情況下,經過了數次Minor GC 之後還會儲存下來的物件才會進入到老年代。如果要儲存的物件超過了伊甸園區的大小,此物件也將直接儲存在老年代之中,當老年代記憶體不足時,將引發 “major GC”,
[WebKit核心] JavaScript引擎深度解析--基礎篇(一)位元組碼生成及語法樹的構建詳情分析
看到HorkeyChen寫的文章《[WebKit] JavaScriptCore解析--基礎篇(三)從指令碼程式碼到JIT編譯的程式碼實現》,寫的很好,深受啟發。想補充一些Horkey沒有寫到的細節比如位元組碼是如何生成的等等,為此成文。 JSC對
JAVA技術(一)——位元組碼&反射
Reflection-反射是J2SE1.1就已經提出了,但當時僅支援Introspection自省。在1.2之後開始逐漸成熟,spirng、hibernate等成熟框架都大量使用java反射技術實現。在面向物件設計思想中,使用類這一概念表述一類具有相同屬性的物件;而這些屬性值
深入理解Java虛擬機器----(七)位元組碼執行引擎
位元組碼執行引擎是執行引擎是最重要的一部分,概念模型的總體外觀是一致的:輸入位元組碼,過程是位元組碼解析的等效過程,輸出結果。不同的虛擬機器有不同的具體實現,大體有解釋執行和編譯執行兩種選擇。 執行時棧幀結構: 棧楨在虛擬機器棧中,是支援方法呼叫和執行的結
jvm原理(17)類載入器名稱空間深度解析與例項分析
我們在 上一節講到例項基礎上做一下改動: public class MyTest21 { public static void main(String[] args) throws Exception{ MyTest16 load
jvm原理(16)類載入器實戰剖析與疑難點解析
三大類載入器所載入的路徑範圍: public class MyTest18 { public static void main(String[] args) { System.out.println(System.getProper
JVM原理(1)
概述 基本概念 JVM:全稱是Java Virtual Machine,是一種能夠執行java bytecode(位元組碼)的虛擬機器。 JIT:全稱為Just-in-time compiler,即時編譯編譯器,用於將java位元組碼轉換成可以直接傳送
[WebKit核心] JavaScriptCore深度解析--基礎篇(一)位元組碼生成及語法樹的構建詳情分析
看到HorkeyChen寫的文章《[WebKit] JavaScriptCore解析--基礎篇(三)從指令碼程式碼到JIT編譯的程式碼實現》,寫的很好,深受啟發。想補充一些Horkey沒有寫到的細節比如位元組碼是如何生成的等等,為此成文。 JS