深入理解Android:Java虛擬機ART

《深入理解Android:Java虛擬機ART》是機械工業出版社於2019年出版的計算機技術圖書,隸屬於“深入理解Android”系列叢書第8本。

該書系統解析Android運行時環境ART虛擬機的架構設計與實現原理,涵蓋Class檔案、dex檔案及ELF檔案格式分析,結合30萬行Android 10.0.0_r39版本源碼,重點剖析dex位元組碼編譯流程、AOT與JIT編譯機制、記憶體分配策略及並發壓縮式垃圾回收技術。全書14章依次闡述開發環境搭建、動態連結機制、虛擬機核心模組實現原理,採用非標準UML圖解析類關係與數據結構,為Android系統最佳化工程師、套用開發者及虛擬機研究者提供底層運行機制參考。

基本介紹

  • 中文名:深入理解Android:Java虛擬機ART
  • 出版時間:2019年4月1日
  • 出版社:機械工業出版社
  • ISBN:9787111621225
內容簡介,圖書目錄,

內容簡介

這是一部從原始碼角度分析和講解Android虛擬機ART的鴻篇巨著,核心內容和價值體現在3個方面:
首先,細緻、深入地分析了ART虛擬機的架構、設計與實現原理,能讓讀者對ART虛擬機有透徹了解;
第二,能讓Andriod系統工程師和套用工程師從底層了解整個Android系統的運行機理,從而寫出更高質量的套用;
第三,Java虛擬機是一個“龐然大物”,學習和理解的門檻較高,ART是迄今套用廣泛的JVM實現,本書為讀者學習JVM提供了獨特的視角和更為容易的路徑。
全書共14章:
第1章介紹了在學習ART虛擬機前需要準備的工具和環境,以及本書的內容結構和閱讀注意事項,建議仔細讀和反覆讀;
第2~4章詳細講解了Class檔案、dex檔案和ELF檔案的格式和內容,理解Class檔案是學習JVM的一步,dex和ELF者是學習Dalvik虛擬機和ART虛擬機的的前提和基礎;
第5章詳細講解了ART虛擬機的實現語言C++11,是閱讀ART原始碼必備的知識;
第6~8章詳細講解了ART虛擬機中與編譯和Runtime相關的大量知識,這是虛擬機的核心和難點;
第9章詳細講解了dex位元組碼轉機器碼的核心進程dex2oat以及.oat和.art的檔案格式;
第10~11章詳細講解了虛擬機的解釋執行、JIT部分以及異常的投遞和處理的過程,以及JNI在ART虛擬機中的實現。
第12~14章詳細講解了虛擬機中Java執行緒的執行、記憶體分配和釋放、垃圾回收的原理與實現。
本書是經典叢書“深入理解Android”系列的第8本,繼承了該系列圖書嚴謹、細緻、深入、編排考究的優點,相信所有Android工程師和Java工程師都能從中受益。

圖書目錄

推薦序
前言
第1章 本書必讀1
1.1 概述1
1.2 準備環境和工具2
1.2.1 準備原始碼2
1.2.2 準備Source Insight2
1.2.3 準備模擬器和自製系統鏡像5
1.2.4 小結8
1.3 本書的內容9
1.4 本書資源下載說明12
第2章 深入理解Class檔案格式13
2.1 Class檔案格式總覽13
2.2 常量池及相關內容14
2.2.1 常量項的類型和關係14
2.2.2 信息描述規則18
2.2.3 常量池實例剖析19
2.3 field_info和method_info19
2.4 access_flags介紹21
2.5 屬性介紹22
2.5.1 屬性概貌22
2.5.2 Code屬性23
2.5.3 LineNumberTable屬性25
2.5.4 LocalVariableTable屬性26
2.6 Java指令碼介紹27
2.6.1 指令碼和助記符27
2.6.2 如何閱讀規範28
2.7 學習路線推薦30
2.8 參考資料30
第3章 深入理解Dex檔案格式31
3.1 Dex檔案格式總覽31
3.1.1 Dex和Class檔案格式的區別31
3.1.2 Dex檔案格式的概貌35
3.2 認識Dex檔案36
3.2.1 header_item36
3.2.2 string_id_item等37
3.2.3 class_def38
3.2.4 code_item40
3.3 Dex指令碼介紹41
3.3.1 insns的組織形式41
3.3.2 指令碼描述規則42
3.4 學習路線推薦44
3.5 參考資料45
第4章 深入理解ELF檔案格式46
4.1 概述46
4.2 ELF檔案格式介紹46
4.2.1 ELF檔案頭結構介紹47
4.2.2 Linking View下的ELF52
4.2.3 Execution View下的ELF61
4.2.4 實例分析:調用動態庫中的函式65
4.2.5 ELF總結72
4.3 學習路線推薦73
4.4 參考資料73
第5章 認識C++1174
5.1 數據類型76
5.1.1 基本內置數據類型介紹76
5.1.2 指針、引用和void類型77
5.1.3 字元和字元串81
5.1.4 數組82
5.2 C++源碼構成及編譯83
5.2.1 頭檔案示例83
5.2.2 源檔案示例85
5.2.3 編譯86
5.3 Class介紹88
5.3.1 構造、賦值和析構函式89
5.3.2 類的派生和繼承97
5.3.3 友元和類的前向聲明103
5.3.4 explicit構造函式105
5.3.5 C++中的struct106
5.4 操作符重載106
5.4.1 操作符重載的實現方式107
5.4.2 輸出和輸入操作符重載108
5.4.3 ->和*操作符重載110
5.4.4 new和delete操作符重載111
5.4.5 函式調用運算符重載117
5.5 函式模板與類模板118
5.5.1 函式模板119
5.5.2 類模板122
5.6 lambda表達式125
5.7 STL介紹127
5.7.1 string類128
5.7.2 容器類129
5.7.3 算法和函式對象介紹134
5.7.4 智慧型指針類138
5.7.5 探討STL的學習140
5.8 其他常用知識141
5.8.1 initializer_list141
5.8.2 帶作用域的enum141
5.8.3 constexpr142
5.8.4 static_assert143
5.9 參考資料143
第6章 編譯dex位元組碼為機器碼145
6.1 編譯器全貌介紹147
6.2 編譯器前端介紹150
6.2.1 詞法分析和lex151
6.2.2 語法分析和yacc160
6.2.3 語義分析和IR生成介紹171
6.3 最佳化器介紹175
6.3.1 構造CFG176
6.3.2 分析和處理CFG181
6.3.3 數據流分析與SSA191
6.3.4 IR最佳化204
6.4 ART中的IR—HInstruction222
6.4.1 ART中的IR222
6.4.2 IR之間的關係225
6.4.3 ART IR對象的初始化231
6.5 暫存器分配233
6.5.1 LSRA介紹235
6.5.2 LSRA相關代碼介紹247
6.6 機器碼生成相關代碼介紹271
6.6.1 GenerateFrameEntry272
6.6.2 VisitAdd和VisitInstance-FieldGet273
6.6.3 GenerateSlowPaths275
6.7 總結277
6.8 參考資料280
第7章 虛擬機的創建283
7.1 概述284
7.1.1 JniInvocation Init函式介紹286
7.1.2 AndroidRuntime startVm函式介紹287
7.2 Runtime Create介紹288
7.2.1 Create函式介紹288
7.2.2 Init函式介紹290
7.3 MemMap與OatFileManager293
7.3.1 MemMap介紹293
7.3.2 OatFileManager介紹298
7.4 FaultManager介紹302
7.4.1 信號處理和SignalAction介紹302
7.4.2 FaultManager介紹307
7.5 Thread介紹311
7.5.1 Startup函式介紹311
7.5.2 Attach函式介紹312
7.6 Heap學習之一325
7.6.1 初識Heap中的關鍵類326
7.6.2 Heap構造函式第一部分337
7.7 JavaVMExt和JNIEnvExt340
7.7.1 JavaVMExt341
7.7.2 JNIEnvExt343
7.7.3 總結344
7.8 ClassLinker345
7.8.1 關鍵類介紹345
7.8.2 ClassLinker構造函式352
7.8.3 InitFromBootImage353
7.8.4 ClassLinker總結360
7.9 總結和閱讀指導362
第8章 虛擬機的啟動363
8.1 Runtime Start364
8.2 初識JNI365
8.2.1 JNI中的數據類型365
8.2.2 ScopedObjectAccess等輔助類367
8.2.3 常用JNI函式介紹369
8.3 Jit LoadCompilerLibrary373
8.4 Runtime InitNativeMethods374
8.4.1 JniConstants Init374
8.4.2 RegisterRuntimeNative Methods375
8.4.3 WellKnownClasses Init和LastInit376
8.5 Thread相關376
8.5.1 Runtime InitThreadGroups377
8.5.2 Thread FinishSetup377
8.5.3 Runtime StartDaemonThreads380
8.6 Runtime CreateSystemClassLoader381
8.7 類的載入、連結和初始化383
8.7.1 關鍵類介紹383
8.7.2 SetupClass392
8.7.3 LoadClass相關函式393
8.7.4 LinkClass相關函式398
8.7.5 DefineClass414
8.7.6 Verify相關函式416
8.7.7 Initialize相關函式424
8.7.8 ClassLinker中其他常用函式426
8.7.9 ClassLoader介紹437
8.8 虛擬機創建和啟動關鍵內容梳理445
第9章 深入理解dex2oat447
9.1 概述448
9.2 ParseArgs介紹452
9.2.1 CompilerOptions類介紹453
9.2.2 ProcessOptions函式介紹454
9.2.3 InsertCompileOptions函式介紹455
9.3 OpenFile介紹456
9.4 Setup介紹458
9.4.1 Setup代碼分析之一458
9.4.2 Setup代碼分析之二464
9.4.3 Setup代碼分析之三474
9.4.4 Setup代碼分析之四484
9.5 CompileImage484
9.5.1 Compile485
9.5.2 ArtCompileDEX496
9.5.3 OptimizingCompiler JniCompile499
9.5.4 OptimizingCompiler Compile527
9.6 OAT和ART檔案格式介紹544
9.6.1 OAT檔案格式544
9.6.2 ART檔案格式550
9.6.3 oatdump介紹554
9.7 總結561
第10章 解釋執行和JIT562
10.1 基礎知識564
10.1.1 LinkCode564
10.1.2 Runtime ArtMethod566
10.1.3 棧和參數傳遞572
10.2 解釋執行580
10.2.1 art_quick_to_interpreter_bridge580
10.2.2 artQuickToInterpreter-Bridge582
10.2.3 EnterInterpreterFromEntry-Point584
10.2.4 調用棧的管理和遍歷593
10.3 ART中的JIT599
10.3.1 Jit、JitCodeCache等600
10.3.2 JIT閾值控制與處理609
10.3.3 OSR的處理612
10.4 HDeoptimize的處理615
10.4.1 VisitDeoptimize相關616
10.4.2 QuickExceptionHandler相關618
10.4.3 解釋執行中關於Deoptimize的處理621
10.5 Instrumentation介紹623
10.5.1 MethodEnterEvent和MethodExitEvent624
10.5.2 DexPcMovedEvent625
10.6 異常投遞和處理625
10.6.1 拋異常626
10.6.2 異常處理629
10.7 總結635
第11章 ART中的JNI636
11.1 JavaVM和JNIEnv637
11.1.1 JavaVMExt相關介紹638
11.1.2 JNIEnvExt介紹642
11.2 Java native方法的調用644
11.2.1 art_jni_dlsym_lookup_stub644
11.2.2 art_quick_generic_jni_trampoline646
11.3 CallStaticVoidMethod651
11.4 JNI中引用型對象的管理653
11.4.1 關鍵類介紹653
11.4.2 JniMethodStart和JniMethod-End657
11.4.3 IndirectReferenceTable相關函式658
11.4.4 NewObject和jobject的含義660
11.4.5 JNI中引用對象相關662
11.4.6 PushLocalFrame和PopLocalFrame663
11.4.7 回收引用對象664
11.5 總結666
第12章 CheckPoints、執行緒同步及信號處理668
12.1 CheckPoints介紹669
12.1.1 設定Check Point標誌位670
12.1.2 Check Points的設定672
12.1.3 執行檢查點處的任務676
12.2 ThreadList和ThreadState681
12.2.1 執行緒ID683
12.2.2 RunCheckpoint和Dump684
12.2.3 SuspendAll和ResumeAll687
12.2.4 Thread狀態切換690
12.3 執行緒同步相關知識691
12.3.1 關鍵類介紹692
12.3.2 synchronized的處理697
12.3.3 Object wait、notifyAll等705
12.4 volatile成員的讀寫707
12.4.1 基礎知識707
12.4.2 解釋執行模式下的處理711
12.4.3 機器碼執行模式的處理712
12.5 信號處理714
12.5.1 zygote進程的處理714
12.5.2 非zygote進程的處理716
12.6 總結719
第13章 記憶體分配與釋放720
13.1 Space等關鍵類介紹722
13.2 ZygoteSpace723
13.3 BumpPointerSpace和RegionSpace725
13.3.1 BumpPointerSpace726
13.3.2 RegionSpace733
13.4 DlMallocSpace和RosAlloc-Space740
13.4.1 DlMallocSpace741
13.4.2 RosAllocSpace745
13.4.3 rosalloc介紹748
13.5 LargeObjectMapSpace760
13.6 new-instance/array指令的處理762
13.6.1 設定記憶體分配器762
13.6.2 解釋執行模式下的處理767
13.6.3 機器碼執行模式下的處理770
13.6.4 Heap AllocObjectWith-Allocator773
13.7 細觀Space779
13.7.1 Space類779
13.7.2 ContinuousSpace和Discon-tinuousSpace類781
13.7.3 MemMapSpace和Continuous MemMapAllocSpace類782
13.7.4 MallocSpace類783
13.8 Heap學習之二784
13.8.1 Heap構造函式784
13.8.2 關鍵類介紹792
13.8.3 ObjectVisitReferences806
13.9 總結812
第14章 ART中的GC813
14.1 GC基礎知識814
14.1.1 Mark-Sweep Collection原理介紹815
14.1.2 Copying Collection原理介紹817
14.1.3 Mark-Compact Collection原理介紹818
14.1.4 其他概念819
14.2 Runtime VisitRoots819
14.2.1 關鍵數據結構821
14.2.2 Thread VisitRoots824
14.3 ART GC概覽827
14.3.1 關鍵數據結構827
14.3.2 ART GC選項830
14.3.3 創建回收器和設定回收策略832
14.4 MarkSweep835
14.4.1 Heap相關成員變數取值情況835
14.4.2 MarkSweep概貌837
14.4.3 MarkingPhase840
14.4.4 PausePhase848
14.4.5 ReclaimPhase851
14.4.6 FinishPhase857
14.4.7 PartialMarkSweep857
14.4.8 StickyMarkSweep858
14.4.9 Concurrent MarkSweep864
14.4.10 Parallel GC868
14.4.11 MarkSweep小結869
14.5 ConcurrentCopying870
14.5.1 InitalizePhase871
14.5.2 FlipThreadRoots873
14.5.3 MarkingPhase881
14.5.4 ReclaimPhase883
14.5.5ConcurrentCopying小結885
14.6 MarkCompact885
14.6.1 MarkingPhase886
14.6.2 ReclaimPhase889
14.6.3 MarkCompact小結891
14.7 SemiSpace892
14.7.1 InitializePhase893
14.7.2 MarkingPhase894
14.7.3 SemiSpace小結898
14.8 Java Reference對象的處理899
14.8.1 基礎知識899
14.8.2 MarkSweep中Reference對象的處理903
14.8.3ReferenceProcessor904
14.8.4 PhantomReference的處理912
14.8.5 finalize函式的調用913
14.8.6 Reference處理小結917
14.9 Heap學習之三917
14.9.1 Heap Trim917
14.9.2 CollectGarbageInternal919
14.9.3 PreZygoteFork924
14.9.4 記憶體碎片的解決926
14.10 總結927
14.11 參考資料928

熱門詞條

聯絡我們