《GraalVM與Java靜態編譯:原理與套用》是2022年機械工業出版社出版的圖書。
基本介紹
- 中文名:GraalVM與Java靜態編譯:原理與套用
- 出版時間:2022年1月1日
- 出版社:機械工業出版社
- ISBN:9787111696391
內容簡介,圖書目錄,作者簡介,
內容簡介
本書作者是阿里靜態編譯研究團隊的核心成員,曾任華為高級工程師,一直從事靜態編譯技術的研究與落地。本書得到業界多位知名專家的鼎力推薦,是深度、系統研究Java靜態編譯技術的鮮見資料。
閱讀本書,讀者可以了解Java靜態編譯技術的特點、實現機制、優缺點等,以將其套用到自己的業務實踐中。
【本書分為三部分】:
第1部分(第1~4章)首先概要介紹Java編譯器的演進過程,然後介紹Java靜態編譯的基本原理、總體能力和發展前景,主要向讀者說明Java靜態編譯技術是什麼、業界主流實現方案、GraalVM結構及靜態編譯套用的流程。
第2部分(第5~12章)詳細介紹GraalVM如何實現Java的靜態編譯,著重介紹如何支持現有Java特性,涵蓋靜態編譯的總體流程、重要機制(擴展、替換、類提前初始化最佳化機制)、動態特性(反射和序列化)實現、跨語言編程能力等。讀者可以掌握GraalVM對Java靜態編譯技術的具體實現原理,了解動態的Java特性是如何被靜態化支持的,洞悉靜態編譯本質。
第3部分(第13~15章)主要關注GraalVM的實踐套用,介紹如何將傳統Java套用編譯為二進制執行檔或靜態庫檔案並部署上雲,以及與傳統的Java程式完全不同的編譯調試技術。讀者可以獲悉靜態編譯實踐中常見問題的解決方案,以更快擁有靜態編譯技術的套用實踐能力。
圖書目錄
【第一部分 從解釋執行到靜態編譯:Java的編譯發展之路】
第1章 Java靜態編譯技術的誕生2
1.1 Java程式的運行生命周期3
1.1.1 初始化4
1.1.2 程式預熱5
1.2 冷啟動問題8
1.3 初識Java靜態編譯技術11
1.3.1 什麼是Java靜態編譯11
1.3.2 靜態編譯的優勢12
1.3.3 靜態編譯的局限性13
1.4 小結15
第2章 Java靜態編譯的業界實現16
2.1 Oracle GraalVM16
2.1.1 GraalVM是什麼17
2.1.2 GraalVM靜態編譯優點19
2.1.3 GraalVM靜態編譯缺點20
2.1.4 GraalVM發展分析21
2.2 華為方舟編譯器22
2.3 小結24
第3章 GraalVM整體結構25
3.1 子項目與組件25
3.2 GraalVM編譯系統工具mx29
3.3 在IDE中打開GraalVM32
3.4 小結33
第4章 從Java程式到本地代碼:靜態編譯套用流程34
4.1 獲取GraalVM JDK35
4.1.1 下載發布版35
4.1.2 下載Docker鏡像37
4.2 從源碼編譯37
4.2.1 編譯準備37
4.2.2 編譯38
4.3 獲取依賴庫40
4.4 預執行目標應用程式41
4.5 靜態編譯目標應用程式43
4.5.1 命令行模式編譯43
4.5.2 配置檔案模式45
4.5.3 Maven外掛程式模式46
4.5.4 Gradle外掛程式模式47
4.6 靜態編譯Java程式實例48
4.6.1 靜態編譯HelloWorld49
4.6.2 靜態編譯Spring Boot套用實例50
4.7 小結52
【第二部分 靜態編譯實現原理】
第5章 Substrate VM靜態編譯框架54
5.1 靜態編譯啟動器55
5.2 靜態編譯實現流程57
5.2.1 類載入59
5.2.2 準備60
5.2.3 靜態分析61
5.2.4 全局構建63
5.2.5 編譯64
5.2.6 生成image65
5.2.7 寫檔案65
5.3 Substrate VM運行時支持67
5.3.1 記憶體管理67
5.3.2 系統信號處理機制69
5.4 小結70
第6章 Feature機制71
6.1 Feature機制概覽71
6.2 Feature管理73
6.2.1 註冊與調用Feature73
6.2.2 Feature依賴74
6.3 Feature影響編譯流程75
6.3.1 Feature函式的入參回調75
6.3.2 訪問ImageSingletons單例庫76
6.4 GraalFeature實現靜態編譯最佳化77
6.4.1 GraalVM編譯器基礎知識77
6.4.2 擴展lowering79
6.4.3 註冊圖的擴展外掛程式79
6.5 Feature接口函式80
6.6 小結82
第7章 編譯時替換機制83
7.1 替換機制在Substrate VM中的套用84
7.2 基於註解的替換85
7.2.1 替換類85
7.2.2 替換枚舉類型87
7.2.3 替換函式88
7.2.4 替換構造函式89
7.2.5 替換類中的域90
7.2.6 替換類的靜態初始化函式92
7.3 實現原理93
7.3.1 替換機制責任鏈93
7.3.2 確定待替換元素集合96
7.3.3 自定義替換內容98
7.4 小結98
第8章 類提前初始化最佳化100
8.1 Java中的類初始化100
8.2 編譯時的類初始化101
8.2.1 類提前初始化的性能分析102
8.2.2 類提前初始化的安全性分析103
8.3 最佳化實現原理106
8.3.1 早期階段分析107
8.3.2 中期階段分析109
8.3.3 後期階段分析111
8.4 手動設定類初始化時機112
8.5 小結113
第9章 反射的實現與最佳化114
9.1 反射在傳統Java中的實現115
9.2 基於配置的支持119
9.2.1 反射配置檔案119
9.2.2 配置局限性121
9.3 Substrate VM的反射實現122
9.3.1 解析配置並註冊反射信息123
9.3.2 反射函式常量摺疊最佳化124
9.3.3 函式反射調用過程最佳化125
9.4 其他類似動態特性的支持126
9.4.1 JNI調用127
9.4.2 動態代理127
9.4.3 資源訪問128
9.4.4 序列化特性129
9.5 小結129
第10章 序列化131
10.1 序列化特性的JDK原生實現131
10.1.1 序列化/反序列化基本流程132
10.1.2 序列化中的靜態編譯不友好特性133
10.2 靜態編譯的序列化實現136
10.2.1 解決動態類載入問題136
10.2.2 解決new抽象類問題138
10.2.3 靜態初始化函式檢查139
10.3 局限性139
10.4 小結141
第11章 跨語言編程:用Java語言編寫共享庫142
11.1 樣例項目cinterfacetutorial 143
11.2 共享庫的Java實現源碼解析145
11.2.1 聲明共享庫上下文145
11.2.2 實現C基本數據結構146
11.2.3 實現C的結構體繼承149
11.2.4 暴露共享庫API149
11.2.5 直接調用C函式152
11.2.6 共享庫函式的返回值153
11.3 靜態編譯JNI共享庫153
11.3.1 JNIDemo項目組織結構153
11.3.2 JNI庫API函式的聲明155
11.3.3 JNI函式編程基本過程156
11.3.4 JNI函式參數傳入String157
11.3.5 自定義JNI函式指針類型158
11.3.6 調用Java函式159
11.4 小結160
第12章 CLibrary機制161
12.1 isolate161
12.1.1 錯誤的多執行緒調用:簡單復用isolate162
12.1.2 正確的多執行緒調用:為每個執行緒新建isolate163
12.1.3 正確的多執行緒調用:映射執行緒與isolate164
12.2 WordBase接口系統165
12.3 註解系統167
12.3.1 @CContext註解167
12.3.2 @CEntryPoint註解172
12.3.3 @InvokeCFunctionPointer註解173
12.4 正確釋放記憶體173
12.5 小結175
【第三部分 靜態編譯實戰】
第13章 靜態編譯Serverless套用到阿里雲函式計算平台178
13.1 阿里雲函式計算平台178
13.2 靜態編譯基於Micronaut的Spring-Boot示例項目179
13.3 部署到阿里雲180
13.4 性能比較180
13.5 小結182
第14章 native-image-agent的實現183
14.1 native-image-agent與JVMTI183
14.2 實現靜態編譯的JVMTI Agent185
14.3 native-image-agent的可用選項188
14.4 小結190
第15章 調試191
15.1 編譯debug版本的native image191
15.2 使用GDB調試native image193
15.2.1 啟動GDB194
15.2.2 增加函式斷點194
15.2.3 GDB TUI分屏界面195
15.2.4 單步調試197
15.2.5 查看Java對象的值197
15.3 小結199
作者簡介
林子熠 博士,阿里巴巴集團技術專家,曾任華為技術有限公司高級軟體開發工程師。
專注於Java靜態編譯方向,主要負責Java靜態編譯技術在阿里巴巴生態中的套用,並以落地實踐中發現的問題為切入點,向GraalVM社區貢獻了多項重要特性,是GraalVM社區建設的積極參與者;曾作為核心人員,負責將華為方舟編譯器前端的Java位元組碼和Art Dex位元組碼轉換為方舟中間語言的開發工作;曾受邀作為上海JUG2019報告嘉賓和北京QCon2020報告嘉賓,介紹GraalVM靜態編譯技術;曾在編譯器領域國際頂級學術會議CGO 2021的Graal專項論壇中報告對Java序列化特性的靜態編譯支持實現。