深入理解Android Java虚拟机ART作者:邓凡平著出版设计:2019年版内容简介 这是一部从源代码角度分析和讲解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章 本书必读11.1 概述11.2 准备环境和工具21.2.1 准备源代码21.2.2 准备Source Insight21.2.3 准备模拟器和自制系统镜像51.2.4 小结81.3 本书的内容91.4 本书资源下载说明12第2章 深入理解Class文件格式132.1 Class文件格式总览132.2 常量池及相关内容142.2.1 常量项的类型和关系142.2.2 信息描述规则182.2.3 常量池实例剖析192.3 field_info和method_info192.4 access_flags介绍212.5 属性介绍222.5.1 属性概貌222.5.2 Code属性232.5.3 LineNumberTable属性252.5.4 LocalVariableTable属性262.6 Java指令码介绍272.6.1 指令码和助记符272.6.2 如何阅读规范282.7 学习路线推荐302.8 参考资料30第3章 深入理解Dex文件格式313.1 Dex文件格式总览313.1.1 Dex和Class文件格式的区别313.1.2 Dex文件格式的概貌353.2 认识Dex文件363.2.1 header_item363.2.2 string_id_item等373.2.3 class_def383.2.4 code_item403.3 Dex指令码介绍413.3.1 insns的组织形式413.3.2 指令码描述规则423.4 学习路线推荐443.5 参考资料45第4章 深入理解ELF文件格式464.1 概述464.2 ELF文件格式介绍464.2.1 ELF文件头结构介绍474.2.2 Linking View下的ELF524.2.3 Execution View下的ELF614.2.4 实例分析:调用动态库中的函数654.2.5 ELF总结724.3 学习路线推荐734.4 参考资料73第5章 认识C++11745.1 数据类型765.1.1 基本内置数据类型介绍765.1.2 指针、引用和void类型775.1.3 字符和字符串815.1.4 数组825.2 C++源码构成及编译835.2.1 头文件示例835.2.2 源文件示例855.2.3 编译865.3 Class介绍885.3.1 构造、赋值和析构函数895.3.2 类的派生和继承975.3.3 友元和类的前向声明1035.3.4 explicit构造函数1055.3.5 C++中的struct1065.4 操作符重载1065.4.1 操作符重载的实现方式1075.4.2 输出和输入操作符重载1085.4.3 ->和*操作符重载1105.4.4 new和delete操作符重载1115.4.5 函数调用运算符重载1175.5 函数模板与类模板1185.5.1 函数模板1195.5.2 类模板1225.6 lambda表达式1255.7 STL介绍1275.7.1 string类1285.7.2 容器类1295.7.3 算法和函数对象介绍1345.7.4 智能指针类1385.7.5 探讨STL的学习1405.8 其他常用知识1415.8.1 initializer_list1415.8.2 带作用域的enum1415.8.3 constexpr1425.8.4 static_assert1435.9 参考资料143第6章 编译dex字节码为机器码1456.1 编译器全貌介绍1476.2 编译器前端介绍1506.2.1 词法分析和lex1516.2.2 语法分析和yacc1606.2.3 语义分析和IR生成介绍1716.3 优化器介绍1756.3.1 构造CFG1766.3.2 分析和处理CFG1816.3.3 数据流分析与SSA1916.3.4 IR优化2046.4 ART中的IR—HInstruction2226.4.1 ART中的IR2226.4.2 IR之间的关系2256.4.3 ART IR对象的初始化2316.5 寄存器分配2336.5.1 LSRA介绍2356.5.2 LSRA相关代码介绍2476.6 机器码生成相关代码介绍2716.6.1 GenerateFrameEntry2726.6.2 VisitAdd和VisitInstance-FieldGet2736.6.3 GenerateSlowPaths2756.7 总结2776.8 参考资料280第7章 虚拟机的创建2837.1 概述2847.1.1 JniInvocation Init函数介绍2867.1.2 AndroidRuntime startVm函数介绍2877.2 Runtime Create介绍2887.2.1 Create函数介绍2887.2.2 Init函数介绍2907.3 MemMap与OatFileManager2937.3.1 MemMap介绍2937.3.2 OatFileManager介绍2987.4 FaultManager介绍3027.4.1 信号处理和SignalAction介绍3027.4.2 FaultManager介绍3077.5 Thread介绍3117.5.1 Startup函数介绍3117.5.2 Attach函数介绍3127.6 Heap学习之一3257.6.1 初识Heap中的关键类3267.6.2 Heap构造函数第一部分3377.7 JavaVMExt和JNIEnvExt3407.7.1 JavaVMExt3417.7.2 JNIEnvExt3437.7.3 总结3447.8 ClassLinker3457.8.1 关键类介绍3457.8.2 ClassLinker构造函数3527.8.3 InitFromBootImage3537.8.4 ClassLinker总结3607.9 总结和阅读指导362第8章 虚拟机的启动3638.1 Runtime Start3648.2 初识JNI3658.2.1 JNI中的数据类型3658.2.2 ScopedObjectAccess等辅助类3678.2.3 常用JNI函数介绍3698.3 Jit LoadCompilerLibrary3738.4 Runtime InitNativeMethods3748.4.1 JniConstants Init3748.4.2 RegisterRuntimeNative Methods3758.4.3 WellKnownClasses Init和LastInit3768.5 Thread相关3768.5.1 Runtime InitThreadGroups3778.5.2 Thread FinishSetup3778.5.3 Runtime StartDaemonThreads3808.6 Runtime CreateSystemClassLoader3818.7 类的加载、链接和初始化3838.7.1 关键类介绍3838.7.2 SetupClass3928.7.3 LoadClass相关函数3938.7.4 LinkClass相关函数3988.7.5 DefineClass4148.7.6 Verify相关函数4168.7.7 Initialize相关函数4248.7.8 ClassLinker中其他常用函数4268.7.9 ClassLoader介绍4378.8 虚拟机创建和启动关键内容梳理445第9章 深入理解dex2oat4479.1 概述4489.2 ParseArgs介绍4529.2.1 CompilerOptions类介绍4539.2.2 ProcessOptions函数介绍4549.2.3 InsertCompileOptions函数介绍4559.3 OpenFile介绍4569.4 Setup介绍4589.4.1 Setup代码分析之一4589.4.2 Setup代码分析之二4649.4.3 Setup代码分析之三4749.4.4 Setup代码分析之四4849.5 CompileImage4849.5.1 Compile4859.5.2 ArtCompileDEX4969.5.3 OptimizingCompiler JniCompile4999.5.4 OptimizingCompiler Compile5279.6 OAT和ART文件格式介绍5449.6.1 OAT文件格式5449.6.2 ART文件格式5509.6.3 oatdump介绍5549.7 总结561第10章 解释执行和JIT56210.1 基础知识56410.1.1 LinkCode56410.1.2 Runtime ArtMethod56610.1.3 栈和参数传递57210.2 解释执行58010.2.1 art_quick_to_interpreter_bridge58010.2.2 artQuickToInterpreter-Bridge58210.2.3 EnterInterpreterFromEntry-Point58410.2.4 调用栈的管理和遍历59310.3 ART中的JIT59910.3.1 Jit、JitCodeCache等60010.3.2 JIT阈值控制与处理60910.3.3 OSR的处理61210.4 HDeoptimize的处理61510.4.1 VisitDeoptimize相关61610.4.2 QuickExceptionHandler相关61810.4.3 解释执行中关于Deoptimize的处理62110.5 Instrumentation介绍62310.5.1 MethodEnterEvent和MethodExitEvent62410.5.2 DexPcMovedEvent62510.6 异常投递和处理62510.6.1 抛异常62610.6.2 异常处理62910.7 总结635第11章 ART中的JNI63611.1 JavaVM和JNIEnv63711.1.1 JavaVMExt相关介绍63811.1.2 JNIEnvExt介绍64211.2 Java native方法的调用64411.2.1 art_jni_dlsym_lookup_stub64411.2.2 art_quick_generic_jni_trampoline64611.3 CallStaticVoidMethod65111.4 JNI中引用型对象的管理65311.4.1 关键类介绍65311.4.2 JniMethodStart和JniMethod-End65711.4.3 IndirectReferenceTable相关函数65811.4.4 NewObject和jobject的含义66011.4.5 JNI中引用对象相关66211.4.6 PushLocalFrame和PopLocalFrame66311.4.7 回收引用对象66411.5 总结666第12章 CheckPoints、线程同步及信号处理66812.1 CheckPoints介绍66912.1.1 设置Check Point标志位67012.1.2 Check Points的设置67212.1.3 执行检查点处的任务67612.2 ThreadList和ThreadState68112.2.1 线程ID68312.2.2 RunCheckpoint和Dump68412.2.3 SuspendAll和ResumeAll68712.2.4 Thread状态切换69012.3 线程同步相关知识69112.3.1 关键类介绍69212.3.2 synchronized的处理69712.3.3 Object wait、notifyAll等70512.4 volatile成员的读写70712.4.1 基础知识70712.4.2 解释执行模式下的处理71112.4.3 机器码执行模式的处理71212.5 信号处理71412.5.1 zygote进程的处理71412.5.2 非zygote进程的处理71612.6 总结719第13章 内存分配与释放72013.1 Space等关键类介绍72213.2 ZygoteSpace72313.3 BumpPointerSpace和RegionSpace72513.3.1 BumpPointerSpace72613.3.2 RegionSpace73313.4 DlMallocSpace和RosAlloc-Space74013.4.1 DlMallocSpace74113.4.2 RosAllocSpace74513.4.3 rosalloc介绍74813.5 LargeObjectMapSpace76013.6 new-instance/array指令的处理76213.6.1 设置内存分配器76213.6.2 解释执行模式下的处理76713.6.3 机器码执行模式下的处理77013.6.4 Heap AllocObjectWith-Allocator77313.7 细观Space77913.7.1 Space类77913.7.2 ContinuousSpace和Discon-tinuousSpace类78113.7.3 MemMapSpace和Continuous MemMapAllocSpace类78213.7.4 MallocSpace类78313.8 Heap学习之二78413.8.1 Heap构造函数78413.8.2 关键类介绍79213.8.3 ObjectVisitReferences80613.9 总结812第14章 ART中的GC81314.1 GC基础知识81414.1.1 Mark-Sweep Collection原理介绍81514.1.2 Copying Collection原理介绍81714.1.3 Mark-Compact Collection原理介绍81814.1.4 其他概念81914.2 Runtime VisitRoots81914.2.1 关键数据结构82114.2.2 Thread VisitRoots82414.3 ART GC概览82714.3.1 关键数据结构82714.3.2 ART GC选项83014.3.3 创建回收器和设置回收策略83214.4 MarkSweep83514.4.1 Heap相关成员变量取值情况83514.4.2 MarkSweep概貌83714.4.3 MarkingPhase84014.4.4 PausePhase84814.4.5 ReclaimPhase85114.4.6 FinishPhase85714.4.7 PartialMarkSweep85714.4.8 StickyMarkSweep85814.4.9 Concurrent MarkSweep86414.4.10 Parallel GC86814.4.11 MarkSweep小结86914.5 ConcurrentCopying87014.5.1 InitalizePhase87114.5.2 FlipThreadRoots87314.5.3 MarkingPhase88114.5.4 ReclaimPhase88314.5.5ConcurrentCopying小结88514.6 MarkCompact88514.6.1 MarkingPhase88614.6.2 ReclaimPhase88914.6.3 MarkCompact小结89114.7 SemiSpace89214.7.1 InitializePhase89314.7.2 MarkingPhase89414.7.3 SemiSpace小结89814.8 Java Reference对象的处理89914.8.1 基础知识89914.8.2 MarkSweep中Reference对象的处理90314.8.3ReferenceProcessor90414.8.4 PhantomReference的处理91214.8.5 finalize函数的调用91314.8.6 Reference处理小结91714.9 Heap学习之三91714.9.1 Heap Trim91714.9.2 CollectGarbageInternal91914.9.3 PreZygoteFork92414.9.4 内存碎片的解决92614.10 总结92714.11 参考资料928 上一篇: 深入浅出行动网站开发 LyzaDangerGardner,JasonGrigsby著 杨仁和译 2012年版 下一篇: 疯狂Android讲义 第4版 李刚编著 2019年版