3dwoo大學簡體電腦書店
Java虛擬機精講
( 簡體 字)
作者:高翔龍類別:1. -> 程式設計 -> JAVA -> Java
出版社:電子工業出版社Java虛擬機精講 3dWoo書號: 41200
詢問書籍請說出此書號!
有庫存
NT售價: 345
出版日:5/1/2015
頁數:280
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787121257056 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第 1 章 Java 體系結構....1
1.1 認識 Java....1
1.1.1 與生俱來的優點.......2
1.1.2 語法結構和對象模型....4
1.1.3 歷史版本追溯.....5
1.2 Java 重要概念....7
1.2.1 Java 編程語言.....7
1.2.2 字節碼....7
1.2.3 Java API....8
1.2.4 Java 虛擬機.....8
1.3 安裝與配置 Java 運行環境.......10
1.3.1 Windows 環境下的安裝與
配置......10
1.3.2 Linux 環境下的安裝與配置.....11
1.3.3 編寫 Java 程序....12
1.3.4 編譯與運行.......13
1.3.5 關鍵字與標示符.....13
1.4 Java 技術的新特性....14
1.4.1 Java 模塊化與 OSGi 技術....14
1.4.2 語言無關性.......15
1.4.3 使用 Fork/Join 框架實現多
核并行....16
1.4.4 豐富的語法特性.....17
1.4.5 過渡到 64 位虛擬機......18
1.5 實戰:玩轉 OpenJDK.....19
1.5.1 JDK 與 OpenJDK 的關系.....19
1.5.2 基于 OpenJDK 深度定制的
淘寶 JVM(TaobaoVM)....20
1.5.3 下載 OpenJDK 源代碼......22
1.5.4 構建編譯環境.....22
1.5.5 執行整個 OpenJDK 的編譯.....23
1.5.6 執行單獨 HotSpot 的編譯....26
1.5.7 導致編譯失敗的一些疑難
雜癥......29
1.5.8 使用 GDB 工具 Debug
HotSpot......30
1.6 本章小結.....36
第 2 章 字節碼的編譯原理.....37
2.1 javac 編譯器簡介.......37
2.1.1 javac 與 Eclipse Compiler for
Java 編譯器.......38
2.1.2 javac 的使用與標準選項配置..39
2.1.3 編譯原理.......40
2.1.4 下載 javac 編譯器源碼......41
2.1.5 調用 compile()方法執行編譯...41
2.2 詞法解析步驟.....43
2.2.1 Token 序列....45
2.2.2 源碼字符集合與 Token 之間
的對應關系.......47
2.2.3 調用 key()方法獲取指定
Token....48
2.2.4 調用 nextToken()方法計算
Token 的獲取規則......48
2.2.5 調用 parseCompilationUnit()
方法執行詞法解析.....49
2.3 語法解析步驟.....51
2.3.1 調用 qualident()方法解析
package 語法節點.......52
2.3.2 調用 importDeclaration()
方法解析 import 語法樹....54
2.3.3 調用 classDeclaration()
方法解析 class 語法樹.......56
2.4 語義解析步驟.....59
2.5 生成字節碼.....61
2.6 實戰:使用 javap 工具分析
字節碼.......62
2.7 實戰:使用 GCJ 編譯器將 Java
源碼直接編譯為本地機器指令......64
2.8 本章小結.....66
第 3 章 字節碼文件......67
3.1 字節碼文件的內部組成結構....67
3.2 符號引用.....73
3.2.1 類或者接口的全限定名.....74
3.2.2 簡單名稱.......74
3.2.3 描述符....74
3.3 常量池......76
3.3.1 CONSTANT_Utf8_info
常量項....77
3.3.2 CONSTANT_Integer_info
常量項....77
3.3.3 CONSTANT_Float_info
常量項....78
3.3.4 CONSTANT_Long_info
常量項....78
3.3.5 CONSTANT_Double_info
常量項....79
3.3.6 CONSTANT_Class_info
常量項....79
3.3.7 CONSTANT_String_info
常量項....80
3.3.8 CONSTANT_Fieldref_info
常量項....81
3.3.9 CONSTANT_Methodref_info
常量項....81
3.3.10 CONSTANT_InterfaceMethodref
_info 常量項....82
3.3.11 CONSTANT_NameAndType
_info 常量項....82
3.3.12 CONSTANT_MethodHandle
_info 常量項....83
3.3.13 CONSTANT_MethodType
_info 常量項....84
3.3.14 CONSTANT_InvokeDynamic
_info 常量項....84
3.4 字段表......85
3.5 方法表......86
3.6 屬性表......88
3.6.1 Code 屬性......89
3.6.2 ConstantValue 屬性....90
3.6.3 Exceptions 屬性......91
3.6.4 LineNumberTable 屬性......92
3.6.5 SourceFile 屬性.......93
3.6.6 LocalVariableTable 屬性......93
3.6.7 InnerClasses 屬性....94
3.6.8 BootstrapMethods 屬性......95
3.7 本章小結.....96
第 4 章 剖析 HotSpot 的 Launcher.......97
4.1 HotSpot 的源碼目錄結構......97
4.2 Launcher 簡介.....99
4.3 跟蹤 Launcher 的執行過程.....101
4.3.1 使用 Launcher 啟動 JVM....101
4.3.2 啟動函數 main()....102
4.3.3 在主線程中執行 JavaMain()
函數....106
4.3.4 調用 JNI_CreateJavaVM()
函數初始化 HotSpot....114
4.3.5 調用 LoadClass()函數獲取
Java 啟動類.....115
4.3.6 調用 GetStaticMethodId()
函數獲取 Java 啟動方法.....116
4.3.7 調用 CallStaticVoidMethod()
函數執行 Java 啟動方法.....116
4.3.8 調用 jni_DestroyJavaVM
函數銷毀 HotSpot.....119
4.4 實戰:在 Launcher 中添加
自定義函數模塊.......120
4.5 本章小結.......121
第 5 章 剖析 HotSpot 的初始化過程......122
5.1 HotSpot 的構成模塊......122
5.2 Prims 模塊....124
5.2.1 JNI 子模塊.......124
5.2.2 JVM 子模塊....125
5.2.3 JVMTI 子模塊.......128
5.2.4 Perf 子模塊......129
5.3 Runtime 模塊.....129
5.3.1 Thread 子模塊.......131
5.3.2 調用 create_vm()函數完成
HotSpot 的最終初始化....131
5.4 跟蹤 HotSpot 的初始化過程......140
5.4.1 調用 init()和 init_2()函數
初始化 os 模塊......141
5.4.2 調用 vm_init_globals()函數
初始化全局數據結構......144
5.4.3 調用 init_globals()函數
初始化全局模塊.......144
5.5 本章小結.......146
第 6 章 內存分配與垃圾回收.....147
6.1 JVM 的運行時內存區結構.....147
6.2 線程共享內存區......148
6.2.1 Java 堆區.....148
6.2.2 方法區.....150
6.2.3 運行時常量池.......150
6.3 線程私有內存區......150
6.3.1 PC 寄存器.......151
6.3.2 Java 棧.....151
6.3.3 本地方法棧.....152
6.4 性能監控區....152
6.5 自動內存管理.......152
6.5.1 內存分配原理.......153
6.5.2 逃逸分析與棧上分配......157
6.5.3 對象內存布局與 OOP-Klass
模型....158
6.5.4 GC 的作用......159
6.5.5 垃圾標記:根搜索算法.....160
6.5.6 垃圾回收:分代收集算法.....161
6.6 垃圾收集器....164
6.6.1 串行回收:Serial 收集器.......165
6.6.2 并行回收:ParNew 收集器...166
6.6.3 程序吞吐量優先:Parallel
收集器.....166
6.6.4 低延遲:CMS(Concurrent-
Mark-Sweep)收集器......167
6.6.5 區域化分代式:G1(Garbage-
First)收集器....170
6.6.6 垃圾收集的相關選項配置......172
6.7 實戰:GC 日志分析......175
6.7.1 不同 GC 日志的展示形式......175
6.7.2 使用 GCHisto 工具分析離線
日志....179
6.8 實戰:分析 dump 文件.....181
6.8.1 使用 jmap 工具生成 dump
文件....181
6.8.2 使用 MAT(Memory Analyzer
Tool)工具分析 dump 文件...182
6.9 本章小結.......184
第 7 章 類加載機制....185
7.1 類加載器.......185
7.1.1 抽象類 ClassLoader......187
7.1.2 雙親委派模型.......188
7.1.3 自定義類加載器.......191
7.1.4 定位 ClassNotFoundException
異常....193
7.1.5 定位 NoClassDefFoundError
異常....194
7.2 類的加載過程.......195
7.2.1 加載字節碼.....198
7.2.2 驗證階段.....199
7.2.3 準備階段.....200
7.2.4 解析階段.....201
7.2.5 初始化階段.....201
7.3 實戰:字節碼文件的加密與
解密.....204
7.4 本章小結.......208
第 8 章 剖析 HotSpot 的架構模型與
執行引擎....209
8.1 棧幀的組成結構.......209
8.1.1 局部變量表.....211
8.1.2 操作數棧.....212
8.1.3 動態鏈接.....214
8.1.4 方法返回值.....216
8.2 HotSpot 中執行引擎的架構
模型....216
8.2.1 本地機器指令.......217
8.2.2 寄存器架構與棧式架構之間
的區別.....218
8.2.3 基于棧式架構的設計......221
8.2.4 調用 call_stub()函數執行 Java
方法....222
8.2.5 棧頂緩存(Top-of-Stack Cashing)
技術....225
8.2.6 實戰:跟蹤字節碼解釋器的
執行步驟.....227
8.3 解釋器與 JIT 編譯器....230
8.3.1 查閱 HotSpot 的運行時執
行模式.....231
8.3.2 解釋器的工作機制與構成
模塊....232
8.3.3 JIT 編譯器的工作機制與
構成模塊.....234
8.3.4 分層編譯策略.......235
8.3.5 熱點探測功能.......236
8.4 本章小結.......239
附錄 A Java7 新增語法特性......241
A.1 try-with-resources 語句....241
A.2 泛型的“<>”類型推斷運算符...245
A.3 聲明二進制字面值.......247
A.4 字面值下畫線支持.......248
A.5 switch 表達式支持 String 類型....250
A.6 mutil-catch 特性......251
A.7 NIO2.0 文件系統的改變....255
附錄 B 指令助記符....262
HotSpot VM 是目前市面上高性能JVM 的代表作之一,它采用解釋器+JIT 編譯器的混合執行引擎,使得Java 程序的執行性能從此有了質的飛躍。本書以極其精練的語句詮釋了HotSpot VM 的方方面面,比如:字節碼的編譯原理、字節碼的內部組成結構、通過源碼的方式剖析HotSpot VM 的啟動過程和初始化過程、Java 虛擬機的運行時內存、垃圾收集算法、垃圾收集器(重點講解了Serial 收集器、ParNew 收集器、Parallel 收集器、CMS(Concurrent-Mark-Sweep)收集器和G1(Garbage-First)收集器)、類加載機制,以及HotSpot VM 基于棧的架構模型和執行引擎(解釋器的工作流程、JIT 編譯器的工作流程、分層編譯策略、熱點探測功能)等技術。

大部分 Java 開發人員,除會在項目中使用到與 Java 平臺相關的各種高精尖技術,對于 Java技術的核心 Java 虛擬機了解甚少。這其中最主要的原因或許是在實際的開發過程中,開發人員根本沒有機會或是沒有必要與 Java 虛擬機等底層技術打交道,更多的只是簡簡單單地將Java 虛擬機作為載體,讓程序能夠順利運行其上即可。
筆者在面試的過程中,經常會對面試者詢問一些與 Java 虛擬機相關的技術問題,但大部
分開發人員對于筆者所提及的問題,幾乎都有一個統一的答案,那就是不知道、不清楚。有些剛從校門出來的應屆畢業生,甚至還包括一些有一定工作經驗的開發人員,打心眼兒里覺得 Struts、Spring 和 Hibernate 等上層技術才是重點,基礎技術并不重要,這其實是一種本末倒置的“病態”。這就好比金庸武俠小說《笑傲江湖》里的令狐沖,盡管獨孤九劍看上去很酷炫,但由于本身內功修煉得不夠,與敵人對抗時又能撐得了幾個回合呢?
對于那些成熟的第三方開源產品,筆者始終只是把它們當作一種工具,用的時候是寶,
不用的時候就丟棄,盡管有些殘忍,但確實就是這么現實。以互聯網項目為例,對于高性能和穩定性的要求往往大于企業級項目的規范化和流程化,因此架構師每天都會不停地思考,應該如何讓我的系統更快?如何避免系統出現瓶頸?如果換作你來做架構師并負責解決這些問題,假如你對 Java 虛擬機一無所知,那么可想而知,你又有什么能力做到系統的性能調優?畢竟性能調優不僅僅只是單純地從應用代碼結構上進行調整,也不是純粹地依靠物理堆機就能夠解決的。
創作此書的目的
盡管并不是所有開發人員都能夠在實際的項目開發過程中用到與 Java 虛擬機相關的優化
技術,但這并不能夠成為你不去了解 Java 虛擬機的理由。只要你從事的是與 Java 開發相關的崗位,那么對 Java 虛擬機實現機制的了解就是你遲早必須攀爬的一座高山。如果你害怕,那么你將永遠也無法屹立在山頂遙望最美的日出。
其實這幾年國內也不乏一些比較優秀的技術作者創作了一些知名度比較高的有關 Java 虛
擬機的作品。但是這些作品的創作初衷完全不同,一些完全是以理論為重心,而另外一些則完全是從底層源碼實戰出發為讀者詮釋 Java 虛擬機的實現細節。盡管這些作品都非常優秀,但筆者認為還不夠簡單,畢竟所面向的讀者更多的是對 Java 虛擬機有一定程度了解的開發人員,對于從未接觸過 Java 虛擬機的讀者,或許會感覺到有些手足無措的挫敗感。因此筆者創作此書的目的,在更大程度上是以更為精練的語句引讀者入門 Java 虛擬機的世界。換句話說,你完全可以將本書看作一個跳板,當你熟知本書的內容后,如果有一種饑渴難耐的感覺,那么恭喜你,筆者建議你閱讀難度更大的書籍,同時本書的目的也就達到了。
本書所面向的讀者
本書適用于任何對 Java 虛擬機感興趣的 Java 開發人員、系統架構師、Java 虛擬機愛好者。尤其是對于那些從未接觸過 Java 虛擬機的 Java 開發人員,本書筆者竭盡所能用最精練和直接的語句詮釋了有關 Java 虛擬機的方方面面,只要你熟練掌握了 Java 編程基礎,那么閱讀本書你將不會感覺到任何的吃力和枯燥乏味。
本書內容
本書的內容包括字節碼的編譯原理、字節碼的內部組成結構、通過源碼的方式剖析HotSpot
VM 的啟動過程和初始化過程、Java 虛擬機的運行時內存、垃圾收集算法、垃圾收集器[重點講解了 Serial 收集器、ParNew 收集器、Parallel 收集器、CMS(Concurrent-Mark-Sweep)收集器和 G1(Garbage-First)收集器]、類加載機制,以及 HotSpot VM 基于棧的架構模型和執行引擎(解釋器的工作流程、JIT 編譯器的工作流程、分層編譯策略、熱點探測功能)等技術。
從本書的第 1 章開始,筆者首先對 Java 的體系結構做了一個簡單且全面的介紹,讓大家
深刻認識到了 Java 虛擬機在 Java 平臺中所占的分量,然而這一章的重點則是在 OpenJDK 和HotSpot VM 的編譯實戰任務上。當大家對 Java 虛擬機有了一個簡單的了解后,本書的第 2 章則開始對字節碼的編譯原理進行了講解,因為大家有必要了解 Java 語言規范與 JVM 規范之間的區別,以及 Java 代碼究竟需要經歷哪些步驟之后才能夠被編譯為一個有效的字節碼文件。
而本書的第 3 章則與上一章息息相關,當大家了解字節碼的編譯原理后,接下來筆者將會對字節碼的內部組成結構進行深入講解。本書的第 4~6 章涉及 HotSpot VM 的部分源碼實現,從Launcher 啟動 HotSpot VM 開始,到 HotSpot VM 的初始化過程都是每一個 Java 開發人員必須掌握和了解的。對于大部分 Java 開發人員而言,對 Java 虛擬機最感興趣的內容莫過于內存管理和垃圾收集,本書用了大量的篇幅來對這些技術進行講解,并且對 Java7 新增的 G1 收集器也做了介紹。在本書的第 7 章中,筆者對類加載機制進行了講解,幫助大家對類的初始化過程理解透徹。然而在本書的最后一章中,筆者對 HotSpot VM 的架構模型和執行引擎進行了深入講解,畢竟執行引擎是 Java 虛擬機中最重要同時也是最核心的部分,運行時編譯技術使得 Java程序的運行性能從此有了質的飛越。
參考文獻
筆者在本書的創作過程中,從下面所列的這些參考資料中獲取了極大的幫助,大家同時也
可以通過如下信息找到更多關于 Java 虛擬機方面的資料,畢竟單靠一本書就想了解Java 虛擬機的所有技術細節幾乎是不可能的,更是不現實的。
□ 《Java 虛擬機規范 Java SE7 版》 [美] Tim Lindholm、Frank Yellin、Gilad Bracha、Alex
Buckley 著;
□ 《深入 Java 虛擬機 第 2 版》 [美] Bill Venners 著;
□ 《Java 性能優化權威指南》 [美]Charlie Hunt、Binu John 著;
□ 《深入理解 Java 虛擬機 第 2 版》周志明 著;
□ 《HotSpot 實戰》 陳濤 著;
□ 《程序員》2014 年 3 月刊《中間語言和虛擬機漫談》 徐宥 著;
□ 《JVM 分享:Java Program in Action》 Rednaxelafx(莫樞) 著;
□ 《HotSpot 內存管理白皮書》。
感謝
此書獻給我這輩子最愛的姥爺。從我誕生那天起,您就將您的慈愛毫不吝嗇地給予了我,
感謝您和姥姥從小對我的陪伴和照顧,是你們讓我擁有了愉快的童年,讓我體會到了親情的溫暖。我記得小時候家里的鸚鵡、畫眉鳥是您最愛的寵物,您會每天帶著它們出去散步,而如今卻成為了我心中永遠的回憶。姥爺,2014 年 05 月 09 日早上 7 點 20 分,當我最后在您耳邊說完悄悄話后,您走了,帶走了我的思念!姥爺,我一定會成為您這輩子的驕傲!除此之外,我們家可愛的小嬌嬌同學,謝謝你的支持和鼓勵才讓我有創作此書的勇氣和動力,謝謝你,我愛你!
接下來要感謝的是 Rednaxelafx(莫樞)和蔡學鏞,您二位在百忙之中抽空閱讀了本書,提出了許多寶貴的意見,沒有你們的支持或許本書至今也無法順利出版。
最后還要感謝的是電子工業出版社博文視點的所有編輯們,謝謝你們無條件忍受著我一
再的跳票,本書能夠順利出版離不開你們如此敬業的精神和一絲不茍的工作態度,由衷地謝謝你們。
高翔龍
2015 年 3 月
pagetop