內容簡介
Java虛擬機非常復雜,要想真正理解它的工作原理,*好的方式就是自己動手編寫一個!
本書是繼《深入理解Java虛擬機》之後的又一經典著作,它一方麵遵循《Java虛擬機規範》,一方麵又獨闢蹊徑,不僅能讓Java虛擬機的學習變得更加簡單和有趣,而且能讓你對Java虛擬機的原理認識更深入和更深刻!
本書摒棄瞭傳統的以解讀枯燥的Java虛擬機規範文檔和分析繁瑣的Java虛擬機源代碼的方式來講解Java虛擬機,取而代之的是,以實踐的方式,引導讀者如何從零開始構建和實現一個Java虛擬機,整個過程不僅能讓讀者做到對Java虛擬機知其然而且知其所以然,還能屏蔽大量不必要的繁瑣細節,體會到實現過程中的成就感,讓學習過程更加輕鬆、愉悅和高效。更重要的是,這種方式能引導讀者更深入地認識和掌握Java虛擬機的工作原理。
作者簡介
張秀宏,資深Java服務器開發工程師,有多年的Java開發、遊戲服務器開發和架構經驗,對Java虛擬機有非常深入的研究。曾在EA、華娛無綫等遊戲公司擔任高級服務器工程師職位,現任樂元素Lead軟件工程師。
精彩書評
想要瞭解Java虛擬機的內部運行原理,閱讀虛擬機規範、書籍、源碼是一種常見的途徑,而從零開始自己動手編寫一個實驗室性質的Java虛擬機,也許會是一種更加有趣且有效的學習路徑。如果不考慮Java龐大類庫的實現和JVM的實際生産力需求,僅是去“正確地”實現一颱Java虛擬機,其實並不如大多數人所想的那樣高深和睏難——隻需正確讀取Class文件中每一條字節碼指令,並且能正確執行這些指令所蘊含的操作即可。通過本書,您可以跟隨作者的思路和指引,一步步完成Java虛擬機的各個組成部分,在動手的過程中瞭解Java虛擬機的運作原理。
—— 周誌明 《深入理解Java虛擬機:JVM高級特性與*佳實踐》 作者
這是國內*一本以實戰模式描述JVM原理的書!秀宏對JVM進行瞭大量研究,在書中深入淺齣地分析瞭class文件的數據結構和JVM的基本原理,並使用Go語言用不到1萬行的程序代碼就實現瞭JVM的基本模型,是Java愛好者瞭解JVM實現原理的一本好書。實戰纔是*有效的掌握知識的手段,快快動手,實現屬於自己的Java虛擬機吧!
—— 淩聰 樂元素CTO
JVM對大多數的Java開發人員,無論是初齣茅廬的菜鳥以及工作多年的老手,可能都還是一個神秘的、高深莫測的黑匣子。本書的齣版,使作者通過一個個實踐的方式,一步步帶領大傢饒有趣味地揭開JVM的神秘麵紗,*大加深程序員對Java的理解,進而構建更加閤理高效的代碼。
—— 金智偉 錢鹹升(北京)網絡科技股份公司CTO
目錄
前言
第1章 命令行工具 1
1.1 準備工作 1
1.2 java命令 4
1.3 編寫命令行工具 5
1.4 測試本章代碼 7
1.5 本章小結 8
第2章 搜索class文件 9
2.1 類路徑 9
2.2 準備工作 10
2.3 實現類路徑 11
2.4 測試本章代碼 20
2.5 本章小結 21
第3章 解析class文件 23
3.1 class文件 24
3.2 解析class文件 25
3.3 解析常量池 35
3.4 解析屬性錶 50
3.5 測試本章代碼 61
3.6 本章小結 63
第4章 運行時數據區 65
4.1 運行時數據區概述 66
4.2 數據類型 67
4.3 實現運行時數據區 68
4.4 測試本章代碼 81
4.5 本章小結 83
第5章 指令集和解釋器 85
5.1 字節碼和指令集 86
5.2 指令和指令解碼 88
5.2.1 Instruction接口 89
5.2.2 BytecodeReader 91
5.3 常量指令 92
5.3.1 nop指令 92
5.3.2 const係列指令 93
5.3.3 bipush和sipush指令 94
5.4 加載指令 94
5.5 存儲指令 95
5.6 棧指令 96
5.6.1 pop和pop2指令 96
5.6.2 dup指令 97
5.6.3 swap指令 98
5.7 數學指令 98
5.7.1 算術指令 98
5.7.2 位移指令 99
5.7.3 布爾運算指令 101
5.7.4 iinc指令 102
5.8 類型轉換指令 102
5.9 比較指令 103
5.10 控製指令 108
5.11 擴展指令 111
5.12 解釋器 114
5.13 測試本章代碼 118
5.14 本章小結 120
第6章 類和對象 121
6.1 方法區 122
6.2 運行時常量池 127
6.3 類加載器 133
6.4 對象、實例變量和類變量 136
6.5 類和字段符號引用解析 141
6.6 類和對象相關指令 144
6.7 測試本章代碼 156
6.8 本章小結 160
第7章 方法調用和返迴 161
7.1 方法調用概述 161
7.2 解析方法符號引用 163
7.3 方法調用和參數傳遞 166
7.4 返迴指令 169
7.5 方法調用指令 170
7.6 改進解釋器 176
7.7 測試方法調用 178
7.8 類初始化 181
7.9 本章小結 185
第8章 數組和字符串 187
8.1 數組概述 187
8.2 數組實現 188
8.3 數組相關指令 191
8.4 測試數組 203
8.5 字符串 204
8.6 測試字符串 207
8.7 本章小結 210
第9章 本地方法調用 211
9.1 注冊和查找本地方法 212
9.2 調用本地方法 213
9.3 反射 215
9.4 字符串拼接和String.intern()方法 225
9.5 Object.hashCode()、equals()和toString() 231
9.6 Object.clone() 233
9.7 自動裝箱和拆箱 235
9.8 本章小結 238
第10章 異常處理 239
10.1 異常處理概述 239
10.2 異常拋齣 240
10.3 異常處理錶 241
10.4 實現athrow指令 245
10.5 Java虛擬機棧信息 248
10.6 測試本章代碼 251
10.7 本章小結 252
第11章 結束 253
11.1 System類是如何被初始化的 253
11.2 初始化System類 255
11.3 System.out.println()是如何工作的 258
11.4 測試本章代碼 260
11.5 總結 260
附錄 指令錶 263????
精彩書摘
想要瞭解Java虛擬機的內部運行原理,閱讀虛擬機規範、書籍、源碼是一種常見的途徑,而從零開始自己動手編寫一個實驗室性質的Java虛擬機,也許會是一種更加有趣且有效的學習路徑。如果不考慮Java龐大類庫的實現和JVM的實際生産力需求,僅是去“正確地”實現一颱Java虛擬機,其實並不如大多數人所想的那樣高深和睏難——隻需正確讀取Class文件中每一條字節碼指令,並且能正確執行這些指令所蘊含的操作即可。通過本書,您可以跟隨作者的思路和指引,一步步完成Java虛擬機的各個組成部分,在動手的過程中瞭解Java虛擬機的運作原理。
—— 周誌明 《深入理解Java虛擬機:JVM高級特性與*佳實踐》 作者
這是國內第一本以實戰模式描述JVM原理的書!秀宏對JVM進行瞭大量研究,在書中深入淺齣地分析瞭class文件的數據結構和JVM的基本原理,並使用Go語言用不到1萬行的程序代碼就實現瞭JVM的基本模型,是Java愛好者瞭解JVM實現原理的一本好書。實戰纔是*有效的掌握知識的手段,快快動手,實現屬於自己的Java虛擬機吧!
—— 淩聰 樂元素CTO
JVM對大多數的Java開發人員,無論是初齣茅廬的菜鳥以及工作多年的老手,可能都還是一個神秘的、高深莫測的黑匣子。本書的齣版,使作者通過一個個實踐的方式,一步步帶領大傢饒有趣味地揭開JVM的神秘麵紗,極大加深程序員對Java的理解,進而構建更加閤理高效的代碼。
—— 金智偉 錢鹹升(北京)網絡科技股份公司CTO
前言/序言
為什麼編寫本書
Java語言於1995年首次公開發布,很快便取得瞭巨大的成功,成為使用最為廣泛的編程語言之一。到現在,Java已經經曆瞭20多個年頭。在這期間,無論是Java語言本身還是Java虛擬機技術,都取得瞭長足的進步。現如今,Java依然長期占據TIOBE網站的編程語言排行榜首。最近更是被TIOBE選為2015年度編程語言,風采可謂不減當年。
眾所周知,Java早已不僅僅是一個單純的語言,而是一個開放的平颱。活躍在這個平颱之上的編程語言除瞭Java之外,還有Groovy、Scala、Clojure、Jython和JRuby等。Java虛擬機則是支持這個平颱的基石。
市麵上教授Java語言的書籍種類繁多,相比之下,介紹Java虛擬機的書籍卻是鳳毛麟角。這足以說明Java作為一門高級語言是多麼成功(讓程序員遠離底層),但並不代錶Java虛擬機技術不重要。恰恰相反,當Java語言掌握到一定程度時,Java虛擬機原理自然就會成為必須越過的一道鴻溝。
近幾年,國內湧現齣瞭一些討論Java虛擬機技術的優秀書籍,這些書籍主要以分析OpenJDK或Oracle JDK為主。本書另闢蹊徑,帶領讀者自己動手從零開始用Go語言編寫Java虛擬機。這樣做好處頗多,彌補瞭OpenJDK等虛擬機的不足。
首先,OpenJDK等虛擬機實現非常復雜。對於初學者而言,很容易陷入代碼的海洋和不必要的細節之中。其次,OpenJDK等虛擬機大多用C++語言編寫。C++語言非常復雜,理解起來難度很大。最後,單純閱讀代碼比較乏味,缺少樂趣,而脫離代碼又很難透徹討論技術。通過自己動手編寫代碼,很好地避免瞭上述問題。看著自己實現的Java虛擬機功能逐漸增強,看到可以運行的Java程序越來越復雜,成就感非常強。總之,通過實踐的方式,相信讀者可以更深刻地領悟Java虛擬機的工作原理。
Go是Google公司於2012年推齣的係統編程語言。從到硬件的距離來看,Go語言介於C和Java之間。Go的語法和C類似,但更加簡潔,因此很容易學習。Go語言內置瞭豐富的基本數據類型,並且支持結構體,所以很適閤用來實現Java虛擬機。Go支持指針,但並不支持指針運算,因此用Go編寫的代碼要比C代碼更加安全。此外,Go還支持垃圾迴收和接口等Java類語言中纔有的功能,大大降低瞭實現Java虛擬機的難度。
以上是本書采用Go語言編寫Java虛擬機的原因,希望讀者在學習本書的過程中,可以喜歡上Go這門還很年輕的語言。
本書主要內容
全書一共分為11章,各章內容安排如下:
第1章:安裝開發環境,討論java命令,並編寫一個類似Java的命令行程序。
第2章:討論Java虛擬機如何搜索class文件,實現類路徑。
第3章:討論class文件結構,實現class文件解析。
第4章:討論運行時數據區,實現綫程私有的運行時數據區,包括綫程、Java虛擬機棧、棧幀、操作數棧和局部變量錶等。
第5章:討論Java虛擬機指令集和解釋器,實現解釋器和150餘條指令。
第6章:討論類、對象以及綫程共享的運行時數據區,實現類加載器、方法區以及部分引用類指令。
第7章:討論方法調用和返迴,實現方法調用和返迴指令。
第8章:討論數組和字符串,實現數組相關指令和字符串池。
第9章:討論本地方法調用,實現Object.hashCode()等本地方法。
第10章:討論異常處理機製,實現athrow指令。
第11章:討論System類的初始化過程和System.out.println()的工作原理等,並對全書進行總結。
本書麵嚮讀者
本書主要麵嚮有一定經驗的Java程序員,但任何對Java虛擬機工作原理感興趣的讀者都可以從本書獲益。如前所述,本書將使用Go語言實現Java虛擬機。書中會簡要介紹Go語言的部分語法以及與Java語言的區彆,但不會深入討論。由於Go語言相對比較簡單,相信任何有C係列語言(如C、C++、C#、Objective-C、Java等)經驗的讀者都可以輕鬆讀懂書中的源代碼。
如何閱讀本書
本書代碼經過精心調整,每一章(第1章除外)都建立在前一章的基礎上,但每一章又都可以單獨編譯和運行。本書內容主要圍繞代碼對Java虛擬機展開討論。讀者可以從第1章開始,按順序閱讀本書並運行每一章的源代碼,也可以直接跳到感興趣的章節閱讀,必要時再閱讀其他章節。
……
自己動手寫Java虛擬機 下載 mobi epub pdf txt 電子書 格式