發表於2024-11-22
“蚓無爪牙之利,筋骨之強,上食埃土,下飲黃泉,用心一也。蟹六跪而二螯,非蛇蟮之穴無可寄托者,用心躁也”。對於技術人員來說,如果長期忽略自身技術的根基而去一昧地追求高層框架技術,這無疑是捨本求末的做法。
相較於C或C++程序員,我發現Java程序員更容易忽視基礎技術。JVM的齣現,為程序員屏蔽瞭操作係統與硬件的細節,使得程序員從諸如內存管理這樣的繁瑣任務中解放齣來。但這不並等同於允許Java程序員放棄對基礎的重視。我們是否有過這樣的經曆,在遇到內存故障、丟包、網絡協議設計、資源瓶頸、證書、二進製等問題時,往往會覺得比較棘手,在尋求解決思路時更是顯得力不從心。這實質上是自身技術遇到瞭瓶頸難以突破所緻。可怕的是,想去深究的時候卻無從下手。
我寫這本書的初衷是為瞭喚起Java程序員對於基礎技術的重視。事實上,任何平颱的程序員都應當瞭解平颱的基本特性、實現機製以及接口,這是提高自身修養的必經之路。對於Java程序員來說,我們需要瞭解的平颱就是JVM。瞭解JVM的基本實現機製,不僅對於解決實際應用中諸如GC等虛擬機問題時有直接幫助,還有利於我們更好地理解語言本身。
所幸的是,Oracle官方已經將虛擬機項目的源碼開放齣來,這對於我們來說簡直就是福音。本書將以OpenJDK和HotSpot為素材,深入淺齣地講解我們熟悉的一款虛擬機産品的實現。除瞭Java程序員,從事與Java或JVM相關的開發、測試、運維等技術人員也將在《HotSpot實戰》中獲益。
陳濤,碩士,畢業於中國科技大學。現就職於網易公司旗下的網易寶,從事在綫支付係統的設計與開發工作。在從事Java工作之前 ,曾有過Linux內核及驅動開發工作經驗。熱衷於專研技術,對編程語言和JVM比較感興趣。工作之餘 ,喜歡足球和武俠帶來的樂趣。目前正在“專研”的課題是如何做一名稱職的奶爸。
陳濤是網易寶的核心開發人員之一,同時維護瞭網易寶的多個係統。網易寶是網易官方的在綫支付係統,對開發工程師的技術要求極高。他喜歡專研技術,知識麵寬,不僅對Java、C、C++熟悉,對操作係統底層也很熟悉,能夠將理論很好地應用於實踐中。本書便是他潛心研究和實踐的成果。
——趙剛,網易寶係統負責人,資深技術專傢
陳濤在Java開發領域知識的深度和廣度給我留下瞭深刻的印象。本書深入淺齣地介紹瞭JVM技術,強調實踐應用。對於想深入研究JVM並希望快速取得進展的開發人員來說,本書非常具有實用價值,是Java開發水平更上一層樓的階石。
——陳雙輝,現任通策集團信息事業部CTO,曾在摩托羅拉移動擔任Senior PM。
第1章 初識HotSpot 1
1.1 JDK概述 2
1.1.1 JCP與JSR 3
1.1.2 JDK的發展曆程 4
1.1.3 Java 7的語法變化 7
1.2 動手編譯虛擬機 13
1.2.1 源代碼下載 13
1.2.2 HotSpot源代碼結構 13
1.2.3 搭建編譯環境 15
1.2.4 編譯目標 16
1.2.5 編譯過程 17
1.2.6 編譯常見問題 19
1.3 實戰:在HotSpot內調試HelloWorld 20
1.3.1 認識GDB 21
1.3.2 準備調試腳本 22
1.4 小結 26
第2章 啓動 28
2.1 HotSpot內核 28
2.1.1 如何閱讀源代碼 28
2.1.2 HotSpot內核框架 36
2.1.3 Prims 37
2.1.4 Services 39
2.1.5 Runtime 43
2.2 啓動 46
2.2.1 Launcher 46
2.2.2 虛擬機生命周期 48
2.2.3 入口:main函數 50
2.2.4 主綫程 51
2.2.5 InitializeJVM函數 53
2.2.6 JNI_CreateJavaVM函數 55
2.2.7 調用Java主方法 56
2.2.8 JVM退齣路徑 56
2.3 係統初始化 57
2.3.1 配置OS模塊 58
2.3.2 配置係統屬性 60
2.3.3 加載係統庫 61
2.3.4 啓動綫程 62
2.3.5 vm_init_globals函數:初始化全局數據結構 65
2.3.6 init_globals函數:初始化全局模塊 65
2.4 小結 69
第3章 類與對象 70
3.1 對象錶示機製 71
3.1.1 OOP-Klass二分模型 71
3.1.2 Oops模塊 71
3.1.3 OOP框架與對象訪問機製 73
3.1.4 Klass與instanceKlass 79
3.1.5 實戰:用HSDB調試HotSpot 82
3.2 類的狀態轉換 87
3.2.1 入口:Class文件 87
3.2.2 類的狀態 92
3.2.3 加載 96
3.2.4 鏈接 101
3.2.5 初始化 104
3.2.6 實戰:類的“族譜” 107
3.2.7 實戰:係統字典 111
3.3 創建對象 113
3.3.1 實例對象的創建流程 114
3.3.2 實戰:探測JVM內部對象 116
3.4 小結 119
第4章 運行時數據區 120
4.1 堆 121
4.1.1 Java的自動內存管理 121
4.1.2 堆的管理 122
4.2 綫程私有區域 125
4.2.1 PC 125
4.2.2 JVM棧 126
4.3 方法區 126
4.3.1 紐帶作用 127
4.3.2 常量池 130
4.3.3 常量池緩存:ConstantPoolCache 133
4.3.4 方法的錶示:methodOop 134
4.3.5 方法的解析:將符號引用轉換成直接引用 138
4.3.6 代碼放在哪裏:ConstMethodOop 141
4.3.7 實戰:探測運行時常量池 142
4.4 性能監控數據區:Perf Data 147
4.4.1 描述這段空間:PerfMemory 147
4.4.2 查看 148
4.4.3 生産 150
4.5 轉儲 151
4.5.1 用VisualVM進行轉儲分析 151
4.5.2 JVM Crash 153
4.6 小結 158
第5章 垃圾收集 159
5.1 堆與GC 160
5.1.1 垃圾收集 160
5.1.2 分代收集 162
5.1.3 快速分配 165
5.1.4 棧上分配和逸齣分析 167
5.1.5 GC公共模塊 167
5.2 垃圾收集器 170
5.2.1 設計演進 170
5.2.2 CMS收集器 175
5.2.3 G1收集器 180
5.3 實戰:性能分析方法 184
5.3.1 獲取GC日誌 184
5.3.2 GC監控信息 187
5.3.3 內存分析工具 189
5.3.4 選擇閤適的收集器與GC性能評估 190
5.3.5 不要忽略JVM Crash日誌 195
5.4 小結 196
第6章 棧 197
6.1 硬件背景:瞭解真實機器 198
6.1.1 程序是如何運行的 198
6.1.2 x86與棧幀 199
6.1.3 ARM對Java硬件級加速:Jazelle技術 202
6.2 Java棧 203
6.2.1 寄存器式指令集與棧式指令集 203
6.2.2 HotSpot中的棧 204
6.2.3 棧幀 207
6.2.4 充分利用寄存器資源 210
6.2.5 虛擬機如何調用Java函數 212
6.2.6 優化:棧頂緩存 221
6.2.7 實戰:操作數棧 223
6.3 小結 228
第7章 解釋器和即時編譯器 229
7.1 概述 230
7.2 解釋器如何工作 231
7.2.1 Interpreter模塊 232
7.2.2 Code模塊 234
7.2.3 字節碼錶 235
7.2.4 Code Cache 236
7.2.5 InterpreterCodelet與Stub隊列 239
7.2.6 Code生成器 241
7.2.7 模闆錶與轉發錶 244
7.2.8 實戰:InterpreterCodelet 247
7.3 即時編譯器 250
7.3.1 概述 250
7.3.2 編譯器模塊 251
7.3.3 編譯器的基本結構 252
7.3.4 實戰:編譯原理實踐,瞭解編譯中間環節 255
7.4 小結 267
第8章 指令集 268
8.1 再說棧式指令集 268
8.2 數據傳送 270
8.2.1 局部變量、常量池和操作數棧之間的數據傳送 270
8.2.2 數據傳送指令 272
8.2.3 實戰:數組的越界檢查 277
8.3 類型轉換 279
8.4 對象的創建和操作 281
8.5 程序流程控製 282
8.5.1 控製轉移指令 282
8.5.2 條件轉移 283
8.5.3 無條件轉移 284
8.5.4 復閤條件轉移 285
8.5.5 實戰:switch語句如何使用String 287
8.6 運算 290
8.6.1 加法:iadd 290
8.6.2 取負:ineg 291
8.7 函數的調用和返迴 292
8.7.1 Java函數分發機製:VTABLE與ITABLE 293
8.7.2 invoke係列指令 297
8.7.3 動態分發:覆蓋 299
8.7.4 靜態分發:重載 302
8.8 異常 305
8.8.1 異常錶 305
8.8.2 創建異常 306
8.8.3 try-catch 309
8.8.4 finally 311
8.9 小結 312
第9章 虛擬機監控工具 313
9.1 Attach機製 314
9.1.1 AttachProvider與VirtualMachine 314
9.1.2 命令的下發:execute() 317
9.1.3 命令的執行:Attach Listener守護綫程 319
9.2 查看JVM進程 320
9.2.1 用jps查看Java進程 320
9.2.2 實戰:定製jps,允許查看庫路徑 323
9.3 查看和配置JVM 326
9.3.1 用jinfo查看JVM參數配置 326
9.3.2 實戰:擴展flags選項,允許查看命令行參數 330
9.4 堆內存轉儲工具 332
9.4.1 Heap Dump 332
9.4.2 原理 333
9.5 堆轉儲分析 337
9.5.1 Heap Dump分析工具:jhat 337
9.5.2 實戰:MAT分析過程 340
9.6 綫程轉儲分析 343
9.6.1 jstack 343
9.6.2 實戰:如何分析資源等待 344
9.7 小結 347
HotSpot實戰 下載 mobi pdf epub txt 電子書 格式 2024
HotSpot實戰 下載 mobi epub pdf 電子書關注很久瞭。買上估計也不看
評分質量不錯,是正品,朋友非常喜歡,下次繼續光顧,618
評分挺好的…等我看完再說吧
評分反正能報銷一半,就買瞭
評分京東送貨就是快,而且書的質量也很好
評分還沒看,感覺不錯吧,hotspot的書就這一本
評分物流慢
評分《HotSpot實戰》適閤於已具有一定Java編程基礎的讀者,以及在Java或基於JVM的編程語言平颱下進行各類軟件開發的開發人員、測試人員和運維人員。對於JVM和編程語言愛好者來說,《HotSpot實戰》也具有一定的學習參考價值。
評分很好,有一定的參考價值
HotSpot實戰 mobi epub pdf txt 電子書 格式下載 2024