你好!欢迎来到《深入理解和实践JVM、反射和内省技术》这门体系课。在Java开发者的成长路径中,JVM往往是一座既令人敬畏又必须跨越的高山。很多人停留在使用层面,对“为什么”知之甚少,而本课程旨在带你穿透代码表象,直击Java虚拟机的核心机制,让你不仅会写代码,更懂代码如何在底层运行。
课程首先从宏观视角入手,通过“总览全局”和“讲讲Java虚拟机的故事”两讲,帮你建立起对JVM演进而来的整体认知框架。但这只是起点,真正的硬仗在于“动手”。我们将挑战编译OpenJDK源码,从Linux到Windows平台,通过六次详细的编译与调试实战,你将亲手触碰虚拟机的源头。这不仅是一次技术演练,更是为了消除对源码的恐惧,让你在面对未来复杂问题时,拥有溯源和排查的底气。
接下来,课程深入JVM的内部世界。在内存空间划分章节,我们将层层剥茧,解析堆、栈、方法区等核心区域的职责与交互。理解内存布局是性能优化的基石,随后我们会聚焦于“对象的创建细节”与“对象布局”,从内存分配的策略到指针碰撞与空闲列表的技术选型,再到对象头中的锁状态与哈希码存储,每一个细节都关乎着系统的吞吐量与延迟。你还将学习到JVM如何高效定位对象,这是垃圾回收的前提。
当然,理解理论的最佳方式是“破坏”它。我们将通过五个实战场景,亲手制造并分析OOM(OutOfMemoryError)异常。你会亲眼看到栈溢出、堆溢出以及元空间溢出的不同表现,这种“实战派”的学习方式能让你在遭遇生产环境故障时迅速定位根源。
课程的另一大核心是垃圾收集。我们从引用计数算法的缺陷讲起,重点剖析可达性分析算法这一现代GC的理论基础。随后,我们将逐一拆解Serial、ParNew、Parallel Scavenge、CMS等经典收集器的工作原理、适用场景及其优缺点。配合GC日志的深度解读,你将学会如何通过日志监控虚拟机的健康状态,制定合理的内存分配策略。
最后,课程延伸至反射和内省技术,这是框架设计的灵魂。结合JVM的深层理解,你将掌握如何通过反射机制在运行时动态获取类信息、调用方法,以及如何通过内省操作JavaBean属性。这些技术不仅是Spring、MyBatis等主流框架的底层支撑,也是你实现通用性组件、进行高级编码的必备技能。
本课程不仅是一堂JVM原理课,更是一次从源码编译到故障排查、从内存管理到动态编程的全方位进阶训练。无论你是希望夯实基础应对面试,还是渴望提升系统调优能力解决线上难题,这门课都将为你提供扎实的理论依据和丰富的实战经验。准备好了吗?让我们一起深入Java虚拟机的黑盒,揭开其神秘面纱。
课程目录
课程目录163 集
- 1 总览全局式的了解Java (18:38).mp4
- 2 讲讲Java虚拟机的故事 (47:43).mp4
- 3 编译OpenJDK源码1 (16:10).mp4
- 4 编译OpenJDK源码2 (22:56).mp4
- 5 跟踪调试OpenJDK里的源码 (32:22).mp4
- 6 Win平台上编译OpenJDK源码1 (20:42).mp4
- 7 Win平台上编译OpenJDK源码2 (13:30).mp4
- 8 Win平台上编译OpenJDK源码3 (08:37).mp4
- 9 Win平台上编译OpenJDK源码4 (20:14).mp4
- 10 Win平台上编译OpenJDK源码5 (10:03).mp4
- 11 JVM对内存空间的划分概述1 (26:38).mp4
- 12 JVM对内存空间的划分概述2 (25:18).mp4
- 13 JVM对内存空间的划分概述3 (37:56).mp4
- 14 JVM对内存空间的划分概述4 (25:20).mp4
- 15 JVM对内存空间的划分概述5 (24:24).mp4
- 16 JVM中创建对象的细节过程 (29:40).mp4
- 17 JVM中对象的布局 (22:27).mp4
- 18 JVM中定位对象的方式 (05:56).mp4
- 19 实战OOM异常的场景1 (17:40).mp4
- 20 实战OOM异常的场景2 (24:44).mp4
- 21 实战OOM异常的场景3 (12:53).mp4
- 22 实战OOM异常的场景4 (28:09).mp4
- 23 实战OOM异常的场景5 (23:52).mp4
- 24 垃圾收集器与内存分配策略概述 (18:32).mp4
- 25 引用计数算法和GC日志1 (27:52).mp4
- 26 引用计数算法和GC日志2 (17:37).mp4
- 27 可达性分析算法 (37:49).mp4
- 28 方法区的垃圾收集 (15:41).mp4
- 29 垃圾收集算法1 (17:26).mp4
- 30 垃圾收集算法2 (37:39).mp4
- 31 串行收集器 (22:36).mp4
- 32 ParNew收集器 (11:56).mp4
- 33 PS等几个老年代收集器 (29:22).mp4
- 34 CMS收集器1 (25:14).mp4
- 35 CMS收集器2 (35:50).mp4
- 36 G1收集器1 (18:37).mp4
- 37 G1收集器2 (35:00).mp4
- 38 G1收集器3 (32:03).mp4
- 39 G1收集器4 (42:46).mp4
- 40 G1收集器5 (23:37).mp4
- 41 最近的收集器 (29:01).mp4
- 42 选择垃圾收集器的理论基础 (12:34).mp4
- 43 实战内存分配与回收策略1 (25:13).mp4
- 44 实战内存分配与回收策略2 (28:18).mp4
- 45 实战内存分配与回收策略3 (08:40).mp4
- 46 JVM监控工具jps和jst (26:01).mp4
- 47 认识压缩类空间和jinfo工具 (24:47).mp4
- 48 JVM工具jmap和jstack (35:35).mp4
- 49 JVM工具jcmd (12:20).mp4
- 50 JVM可视化调试工具的简介 (17:03).mp4
- 51 JVM可视化工具jhsdb (43:35).mp4
- 52 JVM可视化工具jconsole (32:29).mp4
- 53 JVM可视化工具visualvm的认识 (29:34).mp4
- 54 工具visualvm做性能分析 (22:43).mp4
- 55 BTrace工具的初步使用 (25:01).mp4
- 56 JMC的简介 (12:21).mp4
- 57 大内存硬件部署程序的策略 (21:06).mp4
- 58 JVM调优的经典案例2-4 (27:27).mp4
- 59 JVM调优经典例子5-6以及调优总结 (31:44).mp4
- 60 JVM调优Eclipse启动实战 (39:48).mp4
- 61 Class文件的结构概述 (21:52).mp4
- 62 Class文件的魔数和版本 (14:27).mp4
- 63 Class文件的常量池1 (27:49).mp4
- 64 Class文件的常量池2 (26:57).mp4
- 65 访问标志与类索引与父类索引与接口索引集合 (24:35).mp4
- 66 Class文件的字段表 (25:28).mp4
- 67 Class文件的方法表 (17:59).mp4
- 68 Class文件的属性表概述 (11:35).mp4
- 69 属性表的Code属性1 (34:58).mp4
- 70 属性表的Code属性2 (22:32).mp4
- 71 属性表的Code属性3 (18:33).mp4
- 72 Exceptions属性 (08:18).mp4
- 73 LineNumberTable属性 (16:12).mp4
- 74 LocalVariableTable属性 (25:32).mp4
- 75 SourceFile属性 (11:03).mp4
- 76 ConstantValue属性 (11:02).mp4
- 77 第7到9个属性 (08:48).mp4
- 78 第10和11个属性 (33:04).mp4
- 79 第12和13个属性简介 (18:06).mp4
- 80 属性表剩下的一些属性简介 (17:30).mp4
- 81 字节码指令基础知识1 (21:57).mp4
- 82 字节码指令基础知识2 (17:15).mp4
- 83 字节码指令基础知识3 (11:23).mp4
- 84 字节码指令基础知识4 (15:34).mp4
- 85 Java虚拟机类加载机制概述1 (19:48).mp4
- 86 Java虚拟机类加载机制概述2 (24:36).mp4
- 87 类加载中的加载阶段 (25:52).mp4
- 88 类加载中的验证阶段 (34:05).mp4
- 89 类加载中的准备阶段 (16:33).mp4
- 90 类加载中的解析阶段1 (21:36).mp4
- 91 类加载中的解析阶段2 (23:11).mp4
- 92 类加载中的解析阶段3 (16:59).mp4
- 93 类加载中的初始化阶段 (28:14).mp4
- 94 类加载器1 (31:49).mp4
- 95 类加载器2 (28:13).mp4
- 96 类加载器3 (15:38).mp4
- 97 类加载器4 (21:21).mp4
- 98 类加载器5 (27:37).mp4
- 99 模块化系统 (36:37).mp4
- 100 虚拟机字节码执行引擎概述 (21:56).mp4
- 101 局部变量表1 (25:01).mp4
- 102 局部变量表2 (10:44).mp4
- 103 操作栈 (16:58).mp4
- 104 栈帧信息 (17:12).mp4
- 105 方法调用1 (25:36).mp4
- 106 方法调用2 (20:36).mp4
- 107 方法调用3 (31:29).mp4
- 108 方法调用4 (28:10).mp4
- 109 动静态类型语言的区别 (30:29).mp4
- 110 动态方法调用指令的技术背景 (12:35).mp4
- 111 如何使用invoke包里的方法句柄 (27:46).mp4
- 112 invokedynamic指令 (29:23).mp4
- 113 实战方法分派 (31:49).mp4
- 114 基于栈的字节码解释执行引擎1 (29:26).mp4
- 115 基于栈的字节码解释执行引擎2 (15:24).mp4
- 116 分析Tomcat的类加载器架构1 (22:07).mp4
- 117 分析Tomcat的类加载器架构2 (34:19).mp4
- 118 静态代理类实现 (31:34).mp4
- 119 动态代理类实现1 (27:05).mp4
- 120 动态代理类实现2 (21:11).mp4
- 121 实战实现热远程代码的执行1 (23:34).mp4
- 122 实战实现热远程代码的执行2 (31:54).mp4
- 123 实战实现热远程代码的执行3 (23:10).mp4
- 124 前端编译的名词概念1 (24:42).mp4
- 125 前端编译的名词概念2 (26:13).mp4
- 126 Javac编译器的编译过程1 (27:04).mp4
- 127 Javac编译器的编译过程2 (28:27).mp4
- 128 Javac编译器的编译过程3 (18:28).mp4
- 129 Javac编译器的编译过程4 (33:05).mp4
- 130 一个失败的语法糖泛型 (44:03).mp4
- 131 其他语法糖 (10:39).mp4
- 132 实战插入式注解处理器1 (27:50).mp4
- 133 实战插入式注解处理器2 (36:21).mp4
- 134 实战插入式注解处理器3 (23:14).mp4
- 135 实战插入式注解处理器4 (40:05).mp4
- 136 实战插入式注解处理器5 (39:10).mp4
- 137 实战插入式注解处理器6 (16:38).mp4
- 138 解释器与编译器 (37:54).mp4
- 139 编译对象与触发条件1 (25:42).mp4
- 140 编译对象与触发条件2 (11:57).mp4
- 141 编译过程 (23:46).mp4
- 142 实战及时编译器进行编译1 (34:37).mp4
- 143 实战及时编译器进行编译2 (37:26).mp4
- 144 了解提前编译 (36:15).mp4
- 145 实战Jaotc提前编译 (24:28).mp4
- 146 编译优化技术概述 (22:42).mp4
- 147 方法内联 (24:29).mp4
- 148 逃逸分析 (33:48).mp4
- 149 后面两种优化技术 (19:27).mp4
- 150 Java内存模型与线程1 (29:39).mp4
- 151 Java内存模型与线程2 (32:21).mp4
- 152 Java内存模型与线程3 (38:57).mp4
- 153 Java内存模型与线程4 (23:21).mp4
- 154 Java内存模型与线程5 (34:12).mp4
- 155 Java内存模型与线程6 (17:25).mp4
- 156 线程安全 (17:50).mp4
- 157 锁优化 (39:58).mp4
- 158 反射的概述 (24:19).mp4
- 159 反射的使用1 (27:51).mp4
- 160 反射的使用2 (23:26).mp4
- 161 反射的使用3 (34:37).mp4
- 162 反射的使用4 (33:17).mp4
- 163 内省技术的使用 (24:09).mp4






