第10章 Java虚拟机
建立Class文件、类生命周期、类加载子系统、运行时区域、对象布局、oop-klass模型、可达性标记与四类GC算法的基础
第10章 Java虚拟机
在《第10章 Java虚拟机》中,本课程对应刘望舒《Android进阶解密》,电子工业出版社2018年10月初版,468页、702千字,ISBN 9787121348389。原书以Android 8.0系统源码为主;本页不会用Android 10后的ATMS、现代ART实现、Perfetto或新隐藏API政策替换原书链路。
建立Class文件、类生命周期、类加载子系统、运行时区域、对象布局、oop-klass模型、可达性标记与四类GC算法的基础。源码实验固定AOSP Android 8.0与作者出版仓库提交 3860d9e1;后续版本只作为迁移差异,不改变正式目录分母。
学习目标
- 能解释“第10章 Java虚拟机”全部正式目录节点,并定位Android 8.0中的入口类、函数与源码路径。
- 能绘制进程、线程、Binder/JNI/加载边界和关键状态转移,区分请求发出与系统完成。
- 能设计单变量故障实验,验证“对象创建、存放、可达性判断和回收都能映射到明确运行时区域与算法阶段,不用“栈快、堆慢”之类口号替代模型”。
- 能写出包含版本、源码、日志/追踪、反例、停止、恢复、回退和复核人的独立交接记录。
机制总览
第10章 Java虚拟机:机制路径
- 1
从一条可证伪的调用链开始
先预测:混淆Class元数据、对象实例、引用变量和线程栈会导致错误的泄漏/GC判断,也无法把JVM概念正确迁移到ART。把预测写成入口、对象身份、进程/线程、状态和完成回调五列,再去读源码。若结果与预测不同,先修正模型,不要选择性截取调用栈。
- 2
核心词汇与版本门
以上词汇都固定在Android 8.0语义。在《第10章 Java虚拟机》中,Android 7.0只在原书明确比较AMS家族时出现;Android 9以后反射/隐藏API限制、Android 10的ActivityTaskManager、现代Profiler/Perfetto等只能写进迁移备注,不能改写本页正式链路。
- 3
原书目录核对清单
本节把「原书目录核对清单」放回《第10章 Java虚拟机》的输入、状态变化与输出路径中理解。
章级决策实验
第10章 Java虚拟机:机制与证据
切换《第10章 Java虚拟机》的三个关键教学阶段,先解释机制,再用运行与失败证据验证结论。
选择推理阶段
当前阶段 · 从一条可证伪的调用链开始
先预测:混淆Class元数据、对象实例、引用变量和线程栈会导致错误的泄漏/GC判断,也无法把JVM概念正确迁移到ART。把预测写成入口、对象身份、进程/线程、状态和完成回调五列,再去读源码。若结果与预测不同,先修正模型,不要选择性截取调用栈。
可核验证据
在固定 AOSP 8.0 标签上追踪「从一条可证伪的调用链开始」的入口与状态对象,用 PID/TID、源码符号、正常/单变量失败日志和最终系统状态交叉核对。
学完《第10章 Java虚拟机》后,应能从输入和前置条件推导状态变化,并用可重复的构建、运行或边界测试证明结果。
失效—证据矩阵
第10章 Java虚拟机:失效与核验
从一条可证伪的调用链开始
典型失效
若只背诵「从一条可证伪的调用链开始」的类名而不固定 Android 8.0 源码、进程线程、对象身份和完成回调,跨 Binder、JNI 或加载边界后就会把请求误判为结果。
核验证据
在固定 AOSP 8.0 标签上追踪「从一条可证伪的调用链开始」的入口与状态对象,用 PID/TID、源码符号、正常/单变量失败日志和最终系统状态交叉核对。
核心词汇与版本门
典型失效
若只背诵「核心词汇与版本门」的类名而不固定 Android 8.0 源码、进程线程、对象身份和完成回调,跨 Binder、JNI 或加载边界后就会把请求误判为结果。
核验证据
在固定 AOSP 8.0 标签上追踪「核心词汇与版本门」的入口与状态对象,用 PID/TID、源码符号、正常/单变量失败日志和最终系统状态交叉核对。
原书目录核对清单
典型失效
若只背诵「原书目录核对清单」的类名而不固定 Android 8.0 源码、进程线程、对象身份和完成回调,跨 Binder、JNI 或加载边界后就会把请求误判为结果。
核验证据
在固定 AOSP 8.0 标签上追踪「原书目录核对清单」的入口与状态对象,用 PID/TID、源码符号、正常/单变量失败日志和最终系统状态交叉核对。
从一条可证伪的调用链开始
先预测:混淆Class元数据、对象实例、引用变量和线程栈会导致错误的泄漏/GC判断,也无法把JVM概念正确迁移到ART。把预测写成入口、对象身份、进程/线程、状态和完成回调五列,再去读源码。若结果与预测不同,先修正模型,不要选择性截取调用栈。
原书面向应用开发者学习系统源码,重点不是抄完整函数,而是抓住跨层调用的关键节点。每个节点都要回答:谁发起、在哪个进程和线程执行、哪份状态被修改、后续如何被唤醒、失败如何返回、什么现象代表真正完成。
验收不变量是:对象创建、存放、可达性判断和回收都能映射到明确运行时区域与算法阶段,不用“栈快、堆慢”之类口号替代模型。只有源码版本、符号关系、运行轨迹与最终状态四类证据一致,结论才可以进入下一章。
核心词汇与版本门
↡Class文件是本页第1个源码概念,必须同时说明Android 8.0定义、调用者、进程线程、状态、失败反例与证据、↡类生命周期是本页第2个源码概念,必须同时说明Android 8.0定义、调用者、进程线程、状态、失败反例与证据、↡运行时数据区域是本页第3个源码概念,必须同时说明Android 8.0定义、调用者、进程线程、状态、失败反例与证据、↡oop-klass是本页第4个源码概念,必须同时说明Android 8.0定义、调用者、进程线程、状态、失败反例与证据、↡根搜索是本页第5个源码概念,必须同时说明Android 8.0定义、调用者、进程线程、状态、失败反例与证据
以上词汇都固定在Android 8.0语义。在《第10章 Java虚拟机》中,Android 7.0只在原书明确比较AMS家族时出现;Android 9以后反射/隐藏API限制、Android 10的ActivityTaskManager、现代Profiler/Perfetto等只能写进迁移备注,不能改写本页正式链路。
原书目录核对清单
本页承担22个目录或复习节点,正文、图解、实验和题目必须能反向定位每一项:
- 10.1 概述
- 10.1.1 Java虚拟机家族
- 10.1.2 Java虚拟机执行流程
- 10.2 Java虚拟机结构
- 10.2.1 Class文件格式
- 10.2.2 类的生命周期
- 10.2.3 类加载子系统
- 10.2.4 运行时数据区域
- 10.3 对象的创建
- 10.4 对象的堆内存布局
- 10.5 oop-klass模型
- 10.6 垃圾标记算法
- 10.6.1 Java中的引用
- 10.6.2 引用计数算法
- 10.6.3 根搜索算法
- 10.7 Java对象在虚拟机中的生命周期
- 10.8 垃圾收集算法
- 10.8.1 标记—清除算法
- 10.8.2 复制算法
- 10.8.3 标记—压缩算法
- 10.8.4 分代收集算法
- 10.9 本章小结
分步追踪:源码、运行与反例
定位源码入口与责任边界
固定Android 8.0标签,从公开入口向下追踪,不跳过Binder代理、JNI注册、ClassLoader查找或system_server状态对象。
可复现实验
load -> verify -> prepare -> resolve -> initialize -> use -> unloadGC roots -> mark reachable -> sweep/copy/compact -> update referencesobject header | klass pointer | instance fields | alignment padding动手试:在同一镜像、同一构建和同一输入上重复正常、冷启动/首次加载、热路径、单变量失败与恢复五轮。在《第10章 Java虚拟机》中,记录PID/TID、调用入口、对象或token、状态前后值、耗时、异常/返回码和最终可见结果;性能章再记录P50/P95/P99,内存章保留GC Root路径。
独立证据门
第10章 Java虚拟机 的在《第10章 Java虚拟机》中,最小证据包包含:出版社目录、Android版本、源码文件和符号、调用/状态图、PID/TID或加载器身份、一条失败注入、日志/追踪/堆证据、最终结果、已知限制、停止、恢复、回退、责任人与复核人。
练习
练习
问题 1:为什么“第10章 Java虚拟机”必须固定Android 8.0?
问题 2:怎样构造“混淆Class元数据、对象实例、引用变量和线程栈会导致错误的泄漏/GC判断,也无法把JVM概念正确迁移到ART”的最小反例?
问题 3:何时可以认为本页完成独立交接?
本章回顾
“第10章 Java虚拟机”的核心是建立Class文件、类生命周期、类加载子系统、运行时区域、对象布局、oop-klass模型、可达性标记与四类GC算法的基础。混淆Class元数据、对象实例、引用变量和线程栈会导致错误的泄漏/GC判断,也无法把JVM概念正确迁移到ART是必须保留的反证;源码阅读只有连接运行时的进程、线程、状态与最终结果,才从“知道类名”升级为“能诊断”。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- Class文件
Class文件服务于“建立Class文件、类生命周期、类加载子系统、运行时区域、对象布局、oop-klass模型、可达性标记与四类GC算法的基础”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“对象创建、存放、可达性判断和回收都能映射到明确运行时区域与算法阶段,不用“栈快、堆慢”之类口号替代模型”独立验收。
- 类生命周期
类生命周期服务于“建立Class文件、类生命周期、类加载子系统、运行时区域、对象布局、oop-klass模型、可达性标记与四类GC算法的基础”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“对象创建、存放、可达性判断和回收都能映射到明确运行时区域与算法阶段,不用“栈快、堆慢”之类口号替代模型”独立验收。
- 运行时数据区域
运行时数据区域服务于“建立Class文件、类生命周期、类加载子系统、运行时区域、对象布局、oop-klass模型、可达性标记与四类GC算法的基础”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“对象创建、存放、可达性判断和回收都能映射到明确运行时区域与算法阶段,不用“栈快、堆慢”之类口号替代模型”独立验收。
- oop-klass
oop-klass服务于“建立Class文件、类生命周期、类加载子系统、运行时区域、对象布局、oop-klass模型、可达性标记与四类GC算法的基础”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“对象创建、存放、可达性判断和回收都能映射到明确运行时区域与算法阶段,不用“栈快、堆慢”之类口号替代模型”独立验收。
- 根搜索
根搜索服务于“建立Class文件、类生命周期、类加载子系统、运行时区域、对象布局、oop-klass模型、可达性标记与四类GC算法的基础”。掌握标准是能定位Android 8.0源码、画出运行轨迹、构造单变量反例,并用“对象创建、存放、可达性判断和回收都能映射到明确运行时区域与算法阶段,不用“栈快、堆慢”之类口号替代模型”独立验收。
← 上一页:第9章 JNI原理 · 下一页:第11章 Dalvik和ART →
原版目录概念补充核对
以下条目补齐官方目录中容易被示例主线掩盖的概念。它们不重复罗列目录,而是明确每项概念的机制、适用边界和验收证据。
10.1.1 Java虚拟机家族:机制、边界与证据
第10章 Java虚拟机中的10.1.1 Java虚拟机家族涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.1.2 Java虚拟机执行流程:机制、边界与证据
第10章 Java虚拟机中的10.1.2 Java虚拟机执行流程涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.2 Java虚拟机结构:机制、边界与证据
第10章 Java虚拟机中的10.2 Java虚拟机结构涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.2.1 Class文件格式:机制、边界与证据
第10章 Java虚拟机中的10.2.1 Class文件格式必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。
10.2.2 类的生命周期:机制、边界与证据
第10章 Java虚拟机中的10.2.2 类的生命周期涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.2.3 类加载子系统:机制、边界与证据
第10章 Java虚拟机中的10.2.3 类加载子系统涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.2.4 运行时数据区域:机制、边界与证据
第10章 Java虚拟机中的10.2.4 运行时数据区域必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。
10.3 对象的创建:机制、边界与证据
第10章 Java虚拟机中的10.3 对象的创建涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.4 对象的堆内存布局:机制、边界与证据
第10章 Java虚拟机中的10.4 对象的堆内存布局涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.5 oop-klass模型:机制、边界与证据
第10章 Java虚拟机中的10.5 oop-klass模型必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。
10.6 垃圾标记算法:机制、边界与证据
第10章 Java虚拟机中的10.6 垃圾标记算法涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.6.1 Java中的引用:机制、边界与证据
第10章 Java虚拟机中的10.6.1 Java中的引用涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.6.2 引用计数算法:机制、边界与证据
第10章 Java虚拟机中的10.6.2 引用计数算法涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.6.3 根搜索算法:机制、边界与证据
第10章 Java虚拟机中的10.6.3 根搜索算法必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。
10.7 Java对象在虚拟机中的生命周期:机制、边界与证据
第10章 Java虚拟机中的10.7 Java对象在虚拟机中的生命周期涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.8 垃圾收集算法:机制、边界与证据
第10章 Java虚拟机中的10.8 垃圾收集算法涉及 Java、Native、加载器身份与运行时内存边界;同名类型、引用或方法在不同加载器和线程中并不自动等价。用源码符号、类加载日志、JNI 引用计数、堆/GC 轨迹或正反加载案例验证对象身份、生命周期和释放条件。
10.8.1 标记—清除算法:机制、边界与证据
第10章 Java虚拟机中的10.8.1 标记—清除算法必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。
10.8.2 复制算法:机制、边界与证据
第10章 Java虚拟机中的10.8.2 复制算法必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。
10.8.3 标记—压缩算法:机制、边界与证据
第10章 Java虚拟机中的10.8.3 标记—压缩算法必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。
10.8.4 分代收集算法:机制、边界与证据
第10章 Java虚拟机中的10.8.4 分代收集算法必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。
10.9 本章小结:机制、边界与证据
第10章 Java虚拟机中的10.9 本章小结必须落回 Android 8.0 源码中的入口、对象、进程/线程、状态变化与完成点。固定版本和输入,先预测正常链路,再只注入一个失败条件,以源码符号、运行日志和最终系统状态三方核对。