JVM原理与调优

JVM 运行时数据区、Java 对象内存布局、对象创建过程

20 篇文档MODULE 04
DOC

JVM 运行时数据区:堆、虚拟机栈、本地方法栈、程序计数器、元空间(051)

一、全景概览:JVM 内存布局的"五大区域" Java 程序员每天都在 new 对象、调用方法、访问静态变量,但很少有人停下来想一想:这些操作背后,JVM 到底把数据放在了哪里? new Object() 分配…

DOC

Java 对象内存布局:对象头、实例数据、对齐填充与指针压缩(052)

一、为什么需要关心对象内存布局 在 Java 中,我们每天都在写 new Object() ,但很少有人真正想过:一个 Java 对象在内存中到底长什么样?它占用多少字节?这些字节各自代表什么含义?理解对象内存…

DOC

对象创建过程:类检查、内存分配、零值初始化、对象头设置与构造(053)

一、一个对象背后发生了什么 在 Java 中创建一个对象只需要一行代码: MyClass obj = new MyClass(); 。但从 JVM 的角度来看,这行简单的代码背后,实际发生了一系列复杂的步骤。当…

DOC

对象访问与引用类型:句柄/直接指针以及强、软、弱、虚引用(054)

一、两个看似独立却紧密关联的话题 本篇涵盖两个主题: 对象访问方式 (句柄 vs 直接指针)和 Java 引用类型 (强、软、弱、虚)。它们看似独立——一个讨论栈上的引用变量如何定位到堆上的对象,另一个讨论 G…

DOC

类加载生命周期:加载、验证、准备、解析、初始化、卸载(055)

一、类加载不只是"把 class 文件读进来" 很多 Java 程序员对类加载的理解停留在"JVM 从 classpath 找到 class 文件,读进来就能用了"。但实际上,类加载是一个完整的生命周期,从 J…

DOC

类加载器与双亲委派:Bootstrap/Platform/Application、破坏委派与隔离(056)

一、类加载器不只是"加载 class 文件" 上一篇我们讨论了类加载的生命周期,其中"加载"阶段的第一步是"通过全限定名获取类的二进制字节流"。这个步骤的具体执行者,就是 类加载器 (ClassLoader)。…

DOC

GC Roots 与可达性分析:根节点类型、引用链与对象存活判定(057)

一、从引用计数到可达性分析:GC 判定对象存活的两大流派 在讨论垃圾回收(GC)时,第一个要回答的问题是: 如何判断一个对象是"垃圾"——即它不再被需要,可以被安全回收? 这个问题看似简单,但回答方式直接影响 …

DOC

垃圾回收基础算法:标记清除、标记复制、标记整理和分代收集(058)

一、垃圾回收算法的三个维度 上一篇我们讨论了 GC 如何判定对象是否存活(可达性分析),但知道"谁是垃圾"只是第一步,接下来要回答的问题是: 如何回收这些垃圾? 这个问题的答案就是垃圾回收算法。 评价一个垃圾回…

DOC

Serial、Parallel、CMS 收集器:工作过程、停顿特性和适用场景(059)

一、GC 收集器的演进之路 上一篇我们讨论了 GC 的基础算法(标记 清除、标记 复制、标记 整理、分代收集),但算法只是理论,真正执行 GC 的是 垃圾收集器 (Garbage Collector)。不同的收…

DOC

G1 收集器:Region、Remembered Set、SATB、Mixed GC 和停顿预测(060)

一、G1 的设计哲学:可预测的停顿优于最高的吞吐量 G1(Garbage First)收集器是 JDK 9 以来的默认垃圾收集器,它的设计目标是 在低延迟和高吞吐之间找到平衡 ,但更偏向低延迟。G1 的核心设计…

DOC

ZGC 与 Shenandoah:并发整理、染色指针/转发指针和低延迟取舍(061)

一、ZGC 和 Shenandoah 的设计目标:亚毫秒级停顿 在 G1 已经将 GC 停顿控制在几十毫秒级别(默认目标 200ms)之后,垃圾收集器的发展方向转向了一个更激进的目标: 将停顿时间压缩到亚毫秒级…

DOC

Minor GC、Major GC 与 Full GC:触发条件、日志识别和优化方向(062)

一、为什么这三个名字总让人搞混 几乎每个 Java 工程师都听过"Minor GC""Major GC""Full GC"这三个词,但很少有人能准确说清楚它们之间的边界。原因很简单: 这三个名字不是 JVM 规…

DOC

内存分配策略:TLAB、Eden、晋升、年龄阈值和大对象分配(063)

一、从一个"简单"的 new 说起 这行代码背后,JVM 做了至少五件事:类加载检查 → 计算对象大小 → 从堆中分配内存 → 零值初始化 → 设置对象头 → 执行构造函数。其中"分配内存"这一步看似简单,但在…

DOC

常见 OOM 类型:Java heap space、Metaspace、Direct buffer、线程耗尽(064)

一、OOM 不是一种错误,是一个家族 大多数 Java 工程师对 OOM(OutOfMemoryError)的第一反应是"堆内存不够了,调大 Xmx"。但在 JVM 规范中,OOM 有六种不同的子类型,每种对应…

DOC

内存泄漏分析:堆转储、支配树、引用链和 MAT/JProfiler 使用思路(065)

一、内存泄漏不等于内存溢出 很多工程师把"内存泄漏"和"OutOfMemoryError"当作同义词,其实它们是因果关系: 内存泄漏是导致 OOM 最常见的原因,但 OOM 也可能是单纯的容量不足。 内存泄漏的…

DOC

JVM 常用诊断工具:jps、jstat、jstack、jmap、jcmd、Arthas(066)

一、工具箱全景:每个工具解决什么问题 JDK 自带了一套强大的诊断工具集,它们在 $JAVA HOME/bin 目录下,不依赖任何第三方库。但很多工程师只会用 jstack 看线程栈,遇到其他问题就束手无策。本…

DOC

GC 日志分析:统一日志、停顿时间、吞吐量、晋升失败与分配速率(067)

一、为什么 GC 日志比监控面板更重要 监控面板告诉你"GC 花了多少时间",但 GC 日志告诉你"GC 为什么花了这么多时间"。当你看到 Full GC 告警时,监控面板只能告诉你暂停了 2 秒,而 GC 日…

DOC

JIT 编译与分层编译:C1/C2、热点探测、OSR、去优化和逃逸分析(068)

一、Java 是"解释执行"还是"编译执行"?——都不是,是先解释后编译 很多人从教科书上学到"Java 是解释型语言",又有人纠正说"不对,Java 有 JIT 编译器,是编译执行"。两个说法都不完全准确。H…

DOC

JIT 优化技术:方法内联、标量替换、锁消除、公共子表达式消除(069)

一、JIT 优化不是魔法,是一系列可拆解的编译技术 上一篇文章(068)讲了 JIT 编译的整体流程——分层编译、热点探测、去优化。本文深入到 C2 编译器内部,逐一拆解四种最核心的优化技术。理解了这些技术的原…

DOC

JVM 调优方法论:目标设定、基线采集、参数调整、验证与回滚(070)

一、JVM 调优不是"调参数",而是"解决问题" 很多工程师对 JVM 调优的理解停留在"改几个参数然后重启"的层面。真正的 JVM 调优是一个闭环工程:明确目标 采集基线 分析瓶颈 制定方案 调整参数 验证效…