第1章 Java虛擬機概述 1
1.1 從機器語言到Java——詹爺,你好 1
1.2 兼容的選擇:一場生産力的革命 6
1.3 中間語言翻譯 10
1.3.1 從中間語言翻譯到機器碼 11
1.3.2 通過C程序翻譯 11
1.3.3 直接翻譯為機器碼 13
1.3.4 本地編譯 16
1.4 神奇的指令 18
1.4.1 常見匯編指令 20
1.4.2 JVM指令 21
1.5 本章總結 24
第2章 Java執行引擎工作原理:方法調用 25
2.1 方法調用 26
2.1.1 真實的機器調用 26
2.1.2 C語言函數調用 41
2.2 JVM的函數調用機製 47
2.3 函數指針 53
2.4 CallStub函數指針定義 60
2.5 _call_stub_entry例程 72
2.6 本章總結 115
第3章 Java數據結構與麵嚮對象 117
3.1 從Java算法到數據結構 118
3.2 數據類型簡史 122
3.3 Java數據結構之偶然性 129
3.4 Java類型識彆 132
3.4.1 class字節碼概述 133
3.4.2 魔數與JVM內部的int類型 136
3.4.3 常量池與JVM內部對象模型 137
3.5 大端與小端 143
3.5.1 大端和小端的概念 146
3.5.2 大小端産生的本質原因 148
3.5.3 大小端驗證 149
3.5.4 大端和小端産生的場景 151
3.5.5 如何解決字節序反轉 154
3.5.6 大小端問題的避免 156
3.5.7 JVM對字節碼文件的大小端處理 156
3.6 本章總結 159
第4章 Java字節碼實戰 161
4.1 字節碼格式初探 161
4.1.1 準備測試用例 162
4.1.2 使用javap命令分析字節碼文件 162
4.1.3 查看字節碼二進製 165
4.2 魔數與版本 166
4.2.1 魔數 168
4.2.2 版本號 168
4.3 常量池 169
4.3.1 常量池的基本結構 169
4.3.2 JVM所定義的11種常量 170
4.3.3 常量池元素的復閤結構 170
4.3.4 常量池的結束位置 172
4.3.5 常量池元素總數量 172
4.3.6 第一個常量池元素 173
4.3.7 第二個常量池元素 174
4.3.8 父類常量 174
4.3.9 變量型常量池元素 175
4.4 訪問標識與繼承信息 177
4.4.1 access_flags 177
4.4.2 this_class 178
4.4.3 super_class 179
4.4.4 interface 179
4.5 字段信息 180
4.5.1 fields_count 180
4.5.2 field_info fields[fields_count] 181
4.6 方法信息 185
4.6.1 methods_count 185
4.6.2 method_info methods[methods_count] 185
4.7 本章迴顧 205
第5章 常量池解析 206
5.1 常量池內存分配 208
5.1.1 常量池內存分配總體鏈路 209
5.1.2 內存分配 215
5.1.3 初始化內存 223
5.2 oop-klass模型 224
5.2.1 兩模型三維度 225
5.2.2 體係總覽 227
5.2.3 oop體係 229
5.2.4 klass體係 231
5.2.5 handle體係 234
5.2.6 oop、klass、handle的相互轉換 239
5.3 常量池klass模型(1) 244
5.3.1 klassKlass實例構建總鏈路 246
5.3.2 為klassOop申請內存 249
5.3.3 klassOop內存清零 253
5.3.4 初始化mark 253
5.3.5 初始化klassOop._metadata 258
5.3.6 初始化klass 259
5.3.7 自指 260
5.4 常量池klass模型(2) 261
5.4.1 constantPoolKlass模型構建 261
5.4.2 constantPoolOop與klass 264
5.4.3 klassKlass終結符 267
5.5 常量池解析 267
5.5.1 constantPoolOop域初始化 268
5.5.2 初始化tag 269
5.5.3 解析常量池元素 271
5.6 本章總結 279
第6章 類變量解析 280
6.1 類變量解析 281
6.2 偏移量 285
6.2.1 靜態變量偏移量 285
6.2.2 非靜態變量偏移量 287
6.2.3 Java字段內存分配總結 312
6.3 從源碼看字段繼承 319
6.3.1 字段重排與補白 319
6.3.2 private字段可被繼承嗎 325
6.3.3 使用HSDB驗證字段分配與繼承 329
6.3.4 引用類型變量內存分配 338
6.4 本章總結 342
第7章 Java棧幀 344
7.1 entry_point例程生成 345
7.2 局部變量錶創建 352
7.2.1 constMethod的內存布局 352
7.2.2 局部變量錶空間計算 356
7.2.3 初始化局部變量區 359
7.3 堆棧與棧幀 368
7.3.1 棧幀是什麼 368
7.3.2 硬件對堆棧的支持 387
7.3.3 棧幀開闢與迴收 390
7.3.4 堆棧大小與多綫程 391
7.4 JVM的棧幀 396
7.4.1 JVM棧幀與大小確定 396
7.4.2 棧幀創建 399
7.4.3 局部變量錶 421
7.5 棧幀深度與slot復用 433
7.6 最大操作數棧與操作數棧復用 436
7.7 本章總結 439
第8章 類方法解析 440
8.1 方法簽名解析與校驗 445
8.2 方法屬性解析 447
8.2.1 code屬性解析 447
8.2.2 LVT&LVTT 449
8.3 創建methodOop 455
8.4 Java方法屬性復製 459
8.5 與 461
8.6 查看運行時字節碼指令 482
8.7 vtable 489
8.7.1 多態 489
8.7.2 C++中的多態與vtable 491
8.7.3 Java中的多態實現機製 493
8.7.4 vtable與invokevirtual指令 500
8.7.5 HSDB查看運行時vtable 502
8.7.6 miranda方法 505
8.7.7 vtable特點總結 508
8.7.8 vtable機製邏輯驗證 509
8.8 本章總結 511
第9章 執行引擎 513
9.1 執行引擎概述 514
9.2 取指 516
9.2.1 指令長度 519
9.2.2 JVM的兩級取指機製 527
9.2.3 取指指令放在哪 532
9.2.4 程序計數器在哪裏 534
9.3 譯碼 535
9.3.1 模闆錶 535
9.3.2 匯編器 540
9.3.3 匯編 549
9.4 棧頂緩存 558
9.5 棧式指令集 565
9.6 操作數棧在哪裏 576
9.7 棧幀重疊 581
9.8 entry_point例程機器指令 586
9.9 執行引擎實戰 588
9.9.1 一個簡單的例子 588
9.9.2 字節碼運行過程分析 590
9.10 字節碼指令實現 597
9.10.1 iconst_3 598
9.10.2 istore_0 599
9.10.3 iadd 600
9.11 本章總結 601
第10章 類的生命周期 602
10.1 類的生命周期概述 602
10.2 類加載 605
10.2.1 類加載——鏡像類與靜態字段 611
10.2.2 Java主類加載機製 617
10.2.3 類加載器的加載機製 622
10.2.4 反射加載機製 623
10.2.5 import與new指令 624
10.3 類的初始化 625
10.4 類加載器 628
10.4.1 類加載器的定義 628
10.4.2 係統類加載器與擴展類加載器創建 634
10.4.3 雙親委派機製與破壞 636
10.4.4 預加載 638
10.4.5 引導類加載 640
10.4.6 加載、鏈接與延遲加載 641
10.4.7 父加載器 645
10.4.8 加載器與類型轉換 648
10.5 類實例分配 649
10.5.1 棧上分配與逃逸分析 652
10.5.2 TLAB 655
10.5.3 指針碰撞與eden區分配 657
10.5.4 清零 658
10.5.5 偏嚮鎖 658
10.5.6 壓棧與取指 659
10.6 本章總結 661
· · · · · · (
收起)