1. 程式人生 > >jvm原理(26)位元組碼訪問標誌與欄位表詳解

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個位元組組成的

16zabbix 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原理27Java位元組方法屬性深度剖析

上一節說到成員變數,這一節說一下方法表 圖一: 圖二: 圖三: 行號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