《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》從源碼角度解讀HotSpot的內(nèi)部實現(xiàn)機制,本書主要包含三大部分——JVM數(shù)據(jù)結(jié)構(gòu)設(shè)計與實現(xiàn)、執(zhí)行引擎機制及內(nèi)存分配模型。數(shù)據(jù)結(jié)構(gòu)部分包括Java字節(jié)碼文件格式、常量池解析、字段解析、方法解析。每一部分都給出詳細(xì)的源碼實現(xiàn)分析,例如字段解析一章,從源碼層面詳細(xì)分析了Java字段重排、字段繼承等關(guān)鍵機制。再如方法解析一章,給出了Java多態(tài)特性在源碼層面的實現(xiàn)方式。《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》通過直接對源代碼的分析,從根本上梳理和澄清Java領(lǐng)域中的關(guān)鍵概念和機制。執(zhí)行引擎部分包括Java方法調(diào)用機制、棧幀創(chuàng)建機制、指令集架構(gòu)與解釋器實現(xiàn)機制。這一話題是《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》技術(shù)含量高的部分,需要讀者具備一定的匯編基礎(chǔ)。不過千萬不要被“匯編”這個詞給嚇著,其實在作者看來,匯編相比于高級語言而言,語法非常簡單,語義也十分清晰。執(zhí)行引擎部分重點描述Java源代碼如何轉(zhuǎn)換為字節(jié)碼,又如何從字節(jié)碼轉(zhuǎn)換為機器指令從而能夠被物理CPU所執(zhí)行的技術(shù)實現(xiàn)。同時詳細(xì)分析了Java函數(shù)堆棧的創(chuàng)建全過程,在源碼分析的過程中,帶領(lǐng)讀者從本質(zhì)上理解到底什么是Java函數(shù)堆棧和棧幀,以及棧幀內(nèi)部的詳細(xì)結(jié)構(gòu)。內(nèi)存分配部分主要包括類型創(chuàng)建與加載、對象實例創(chuàng)建與內(nèi)存分配,例如new關(guān)鍵字的工作機制,import關(guān)鍵字的作用,再如java.lang.ClassLoader.loadClass()接口的本地實現(xiàn)機制。《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》并不是簡單地分析源碼實現(xiàn),而是在描述HotSpot內(nèi)部實現(xiàn)機制的同時,分析了HotSpot如此這般實現(xiàn)的技術(shù)必然性。讀者在閱讀《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》的過程中,將會在很多地方看到作者本人的這種思考。
Java是一門非常流行的程序語言,但是,Java程序到底是如何運行的?如何寫出更高效的Java代碼……?這些令人困擾的問題,都可以從本書中找到答案。
隨著互聯(lián)網(wǎng)的極速發(fā)展,現(xiàn)在的Java 服務(wù)端應(yīng)用需要應(yīng)對極高的并發(fā)訪問和大量的數(shù)據(jù)交互,如果能深入地理解Java虛擬機的核心原理和實現(xiàn)細(xì)節(jié),不僅可以幫助程序員自如地應(yīng)對變化莫測的各類狀況,也可以幫助程序員寫出高效的代碼。
《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》正是這樣一部修煉Java內(nèi)功的武學(xué)秘笈。它不僅詳細(xì)闡述了JVM的設(shè)計思路與原理,讓讀者能夠深刻理解JVM的運行機制,而且更進(jìn)一步地分析了JVM在發(fā)展過程中每一次技術(shù)選擇的必然性——這樣的分析讓讀者得以跨越時空,在思想上與前輩大師們產(chǎn)生共鳴,實現(xiàn)精神上的交流,真正領(lǐng)悟JVM的精髓。
更為難得的是,看似艱深莫測的“大道理”,卻被作者用曉暢明白、幽默有趣的文字層層化解了:本書在閱讀體驗上毫無枯燥之感,相反,卻能讓你在“頓悟”的當(dāng)下,會心而笑,不忍釋卷!
不必猶豫,無須比較,就是它——《揭秘Java虛擬機:JVM設(shè)計原理與實現(xiàn)》!
大學(xué)學(xué)的是生物技術(shù),但是對計算機保持濃厚興趣,當(dāng)年對vb、matlab等語言和工具學(xué)的很熟練。畢業(yè)后跨界做了軟件開發(fā),先后接觸了匯編、c、c 、php、asp、java等多種語言,開發(fā)過圖形庫、物聯(lián)網(wǎng)傳感器通信協(xié)議、GIS監(jiān)控定位、電商平臺等。進(jìn)入菜鳥之后,主導(dǎo)結(jié)算復(fù)雜的業(yè)務(wù)接入平臺化以及業(yè)務(wù)仿真系統(tǒng)。
第1章 Java虛擬機概述 1
1.1 從機器語言到Java——詹爺,你好 1
1.2 兼容的選擇:一場生產(chǎn)力的革命 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 本章總結(jié) 24
第2章 Java執(zhí)行引擎工作原理:方法調(diào)用 25
2.1 方法調(diào)用 26
2.1.1 真實的機器調(diào)用 26
2.1.2 C語言函數(shù)調(diào)用 41
2.2 JVM的函數(shù)調(diào)用機制 47
2.3 函數(shù)指針 53
2.4 CallStub函數(shù)指針定義 60
2.5 _call_stub_entry例程 72
2.6 本章總結(jié) 115
第3章 Java數(shù)據(jù)結(jié)構(gòu)與面向?qū)ο?117
3.1 從Java算法到數(shù)據(jù)結(jié)構(gòu) 118
3.2 數(shù)據(jù)類型簡史 122
3.3 Java數(shù)據(jù)結(jié)構(gòu)之偶然性 129
3.4 Java類型識別 132
3.4.1 class字節(jié)碼概述 133
3.4.2 魔數(shù)與JVM內(nèi)部的int類型 136
3.4.3 常量池與JVM內(nèi)部對象模型 137
3.5 大端與小端 143
3.5.1 大端和小端的概念 146
3.5.2 大小端產(chǎn)生的本質(zhì)原因 148
3.5.3 大小端驗證 149
3.5.4 大端和小端產(chǎn)生的場景 151
3.5.5 如何解決字節(jié)序反轉(zhuǎn) 154
3.5.6 大小端問題的避免 156
3.5.7 JVM對字節(jié)碼文件的大小端處理 156
3.6 本章總結(jié) 159
第4章 Java字節(jié)碼實戰(zhàn) 161
4.1 字節(jié)碼格式初探 161
4.1.1 準(zhǔn)備測試用例 162
4.1.2 使用javap命令分析字節(jié)碼文件 162
4.1.3 查看字節(jié)碼二進(jìn)制 165
4.2 魔數(shù)與版本 166
4.2.1 魔數(shù) 168
4.2.2 版本號 168
4.3 常量池 169
4.3.1 常量池的基本結(jié)構(gòu) 169
4.3.2 JVM所定義的11種常量 170
4.3.3 常量池元素的復(fù)合結(jié)構(gòu) 170
4.3.4 常量池的結(jié)束位置 172
4.3.5 常量池元素總數(shù)量 172
4.3.6 及時個常量池元素 173
4.3.7 第二個常量池元素 174
4.3.8 父類常量 174
4.3.9 變量型常量池元素 175
4.4 訪問標(biāo)識與繼承信息 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 常量池內(nèi)存分配 208
5.1.1 常量池內(nèi)存分配總體鏈路 209
5.1.2 內(nèi)存分配 215
5.1.3 初始化內(nèi)存 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的相互轉(zhuǎn)換 239
5.3 常量池klass模型(1) 244
5.3.1 klassKlass實例構(gòu)建總鏈路 246
5.3.2 為klassOop申請內(nèi)存 249
5.3.3 klassOop內(nèi)存清零 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模型構(gòu)建 261
5.4.2 constantPoolOop與klass 264
5.4.3 klassKlass終結(jié)符 267
5.5 常量池解析 267
5.5.1 constantPoolOop域初始化 268
5.5.2 初始化tag 269
5.5.3 解析常量池元素 271
5.6 本章總結(jié) 279
第6章 類變量解析 280
6.1 類變量解析 281
6.2 偏移量 285
6.2.1 靜態(tài)變量偏移量 285
6.2.2 非靜態(tài)變量偏移量 287
6.2.3 Java字段內(nèi)存分配總結(jié) 312
6.3 從源碼看字段繼承 319
6.3.1 字段重排與補白 319
6.3.2 private字段可被繼承嗎 325
6.3.3 使用HSDB驗證字段分配與繼承 329
6.3.4 引用類型變量內(nèi)存分配 338
6.4 本章總結(jié) 342
第7章 Java棧幀 344
7.1 entry_point例程生成 345
7.2 局部變量表創(chuàng)建 352
7.2.1 constMethod的內(nèi)存布局 352
7.2.2 局部變量表空間計算 356
7.2.3 初始化局部變量區(qū) 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 棧幀創(chuàng)建 399
7.4.3 局部變量表 421
7.5 棧幀深度與slot復(fù)用 433
7.6 較大操作數(shù)棧與操作數(shù)棧復(fù)用 436
7.7 本章總結(jié) 439
第8章 類方法解析 440
8.1 方法簽名解析與校驗 445
8.2 方法屬性解析 447
8.2.1 code屬性解析 447
8.2.2 LVT&LVTT 449
8.3 創(chuàng)建methodOop 455
8.4 Java方法屬性復(fù)制 459
8.5
8.6 查看運行時字節(jié)碼指令 482
8.7 vtable 489
8.7.1 多態(tài) 489
8.7.2 C 中的多態(tài)與vtable 491
8.7.3 Java中的多態(tài)實現(xiàn)機制 493
8.7.4 vtable與invokevirtual指令 500
8.7.5 HSDB查看運行時vtable 502
8.7.6 miranda方法 505
8.7.7 vtable特點總結(jié) 508
8.7.8 vtable機制邏輯驗證 509
8.8 本章總結(jié) 511
第9章 執(zhí)行引擎 513
9.1 執(zhí)行引擎概述 514
9.2 取指 516
9.2.1 指令長度 519
9.2.2 JVM的兩級取指機制 527
9.2.3 取指指令放在哪 532
9.2.4 程序計數(shù)器在哪里 534
9.3 譯碼 535
9.3.1 模板表 535
9.3.2 匯編器 540
9.3.3 匯編 549
9.4 棧頂緩存 558
9.5 棧式指令集 565
9.6 操作數(shù)棧在哪里 576
9.7 棧幀重疊 581
9.8 entry_point例程機器指令 586
9.9 執(zhí)行引擎實戰(zhàn) 588
9.9.1 一個簡單的例子 588
9.9.2 字節(jié)碼運行過程分析 590
9.10 字節(jié)碼指令實現(xiàn) 597
9.10.1 iconst_3 598
9.10.2 istore_0 599
9.10.3 iadd 600
9.11 本章總結(jié) 601
第10章 類的生命周期 602
10.1 類的生命周期概述 602
10.2 類加載 605
10.2.1 類加載——鏡像類與靜態(tài)字段 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 系統(tǒng)類加載器與擴展類加載器創(chuàng)建 634
10.4.3 雙親委派機制與破壞 636
10.4.4 預(yù)加載 638
10.4.5 引導(dǎo)類加載 640
10.4.6 加載、鏈接與延遲加載 641
10.4.7 父加載器 645
10.4.8 加載器與類型轉(zhuǎn)換 648
10.5 類實例分配 649
10.5.1 棧上分配與逃逸分析 652
10.5.2 TLAB 655
10.5.3 指針碰撞與eden區(qū)分配 657
10.5.4 清零 658
10.5.5 偏向鎖 658
10.5.6 壓棧與取指 659
10.6 本章總結(jié) 661
對精通java底層的運行原理有幫助
ok ok ok
寫得很好,思考模式跟我不要太一致