天天看點

深入了解Java虛拟機----第六章:類檔案結構

目錄

第一章:走進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 類型轉換指令

将兩種不同的數值類型進行轉換,一般用于顯式類型轉換

6.4.5 對象建立與通路指令

6.4.6 操作數棧管理指令

6.4.7 控制轉移指令

6.4.8 方法調用和傳回指令

6.4.9 異常處理指令

6.4.10 同步指令

深入了解Java虛拟機----第六章:類檔案結構