目錄
第一章:走進Java
第二章:Java記憶體區域與記憶體溢出異常
第三章:垃圾收集器與記憶體配置設定政策
第四章:虛拟機性能監控與故障處理
第五章:調優案例分析與實戰
第六章:類檔案結構
第七章:虛拟機類加載機制
第八章:虛拟機位元組碼執行引
第九章:類加載及其執行子系統的案例與實戰
第十章:早期(編譯器)優化
第十一章:晚期(運作期)優化
第十二章:Java記憶體模型與線程
第十三章:線程安全與鎖優化
第六章:類檔案結構
-
- 目錄
- 第六章:類檔案結構
- 6.1概述
- 6.2無關性的基石
- 6.3class類檔案結構
- 6.3.1 魔數與class檔案的版本
- 6.3.2常量池
- 6.3.3通路标志
- 6.3.4類索引、父類索引與接口索引集合
- 6.3.5字段表合集
- 6.3.6方法表合集
- 6.3.7屬性表集合
- 6.4位元組碼指令簡介
- 6.4.1 位元組碼與資料類型
- 6.4.2 加載和存儲指令
- 6.4.3 運算指令
- 6.4.4 類型轉換指令
- 6.4.5 對象建立與通路指令
- 6.4.6 操作數棧管理指令
- 6.4.7 控制轉移指令
- 6.4.8 方法調用和傳回指令
- 6.4.9 異常處理指令
- 6.4.10 同步指令
6.1概述
計算機隻能識别0和1
虛拟機以及建立在虛拟機上語言的出現,使編寫的程式編譯成二進制本地機碼(native code)非唯一選擇,越來越多程式設計語言選擇了與作業系統和機器指令集無關、平台中立的格式作為程式編譯後的存儲格式
6.2無關性的基石
虛拟機可以載入和執行同一種平台無關的位元組碼
各種平台不同的虛拟機和各個平台統一使用的程式存儲格式-位元組碼(Bytecode),是平台無關性的基石
虛拟機一種中立特性–語言無關性正越來越被重視,基礎仍舊是虛拟機和位元組碼存儲格式,虛拟機不和某種語言綁定,隻和“Class檔案”這種特定的二進制檔案相關聯,Class檔案包含了Java虛拟機指令集和符号表以及其他輔助資訊
基于安全性的考慮,Java虛拟機規範要求Class檔案中使用許多強制性的文法和結構化限制
6.3class類檔案結構
class檔案是以8位位元組為基礎機關的二進制流,各個資料項按順序緊密排序,中間沒有添加任何分隔符,8位位元組以上的資料按高位在前的方式分隔成若幹個8位位元組進行存儲
class檔案格式隻有兩種資料類型
無符号數
屬于基本資料類型,以u1、u2、u4、u8代表1、2、4、8個位元組的無符号數
用來描述數字、索引引用、數量值或者按照UTF-8編碼構成的字元串
表
多個無符号數或者其他表作為資料項構成的複合資料類型
描述有層次關系的複合結構的資料
6.3.1 魔數與class檔案的版本
唯一目的是确定這個檔案是否是能被虛拟機接受的class檔案
使用魔數而不是擴充名是出于安全考慮,因為擴充名可以随意改動
class檔案的魔數:0xCAFEBABF
次版本号
主版本号
6.3.2常量池
class檔案中的資源倉庫
常量池容器計數器是從1開始的,且隻有常量池計數從1開始
0用來表達“不引用任何一個常量池項目”
存放兩大類常量
字面量(Literal)
接近于java的常量,如文本字元串、聲明為final的常量值
符号引用(Symbolic References)
- 類和接口的全限定名
- 字段的名稱和描述
- 方法的名稱和描述
常量池的項目類型
常量項結構1
常量項結構2
6.3.3通路标志
識别類或者接口層次通路資訊
6.3.4類索引、父類索引與接口索引集合
确定類的繼承關系
6.3.5字段表合集
類級變量、執行個體級變量
字段表結構
描述符的作用是描述字段的資料類型、方法的參數清單(數量、類型以及順暢)和傳回值,基本資料類型和void都用一個大寫字母表示,對象類型用L加上對象的全限定名稱類表示
不會列出從超類或者繼承而來的字段,有可能列出java代碼中不存在的字段
6.3.6方法表合集
方法表結構
方法通路标志
6.3.7屬性表集合
虛拟機規範預定義的屬性
6.4位元組碼指令簡介
Java虛拟機的指令由一個位元組長度的、代表着某種特定操作含義的數字(操作麼Opscode)以及零至多個代表操作所需參數(稱為操作數)而構成
6.4.1 位元組碼與資料類型
6.4.2 加載和存儲指令
将資料在棧幀中的局部變量表和操作數棧之間來回傳輸
6.4.3 運算指令
兩個操作數棧上的值進行某種特定運算,并把結果重寫寫到操作棧頂
6.4.4 類型轉換指令
将兩種不同的數值類型進行轉換,一般用于顯式類型轉換