知其然,知其所以然
Java 内部原理 2026-10-03

锁粗化与锁消除

在 JDK 21 与 27 上真实测量锁粗化与锁消除:同一锁连续 3 个 synchronized 块 15.3 → 5.13 ns;局部 Vector 2.6 ns 对比关闭后 20–26 ns;粗化不依赖逃逸分析,消除局部对象锁两个开关都要开;字节码里没有粗化。

Java 锁粗化 锁消除 逃逸分析 synchronized JIT 真实验证 动画演示
Java 内部原理 2026-10-03

Flow API:Java 中的背压接口

反射列出 java.util.concurrent.Flow 的 4 个接口;手写 Publisher 观察 request(n) 与 onNext 的真实顺序和线程、request(0)、cancel、无界请求;手写 Processor 验证需求如何向上游传递。

Java Flow 响应式流 背压 Publisher Subscriber 真实验证 动画演示
Java 内部原理 2026-10-03

SubmissionPublisher:异步发布如何处理慢订阅者

真实运行验证 SubmissionPublisher:容量向上取整到 2 的幂,订阅者不 request 时 submit 阻塞且阻塞期间 estimateMaximumLag 也被阻塞;offer 的返回值与 onDrop;默认在 commonPool 执行;订阅者异常、非正数 request、closeExceptionally 的行为。

Java SubmissionPublisher 背压 Flow 缓冲区 真实验证 动画演示
Java 内部原理 2026-10-03

CompletableFuture 默认执行器

真实运行验证 CompletableFuture 每一步的执行线程:thenApply 在完成者线程或调用者线程,thenApplyAsync 回到 commonPool;并行度为 1 或 0 时默认执行器变成每任务一个非守护线程;orTimeout 与 cancel 不会中断底层任务。

Java CompletableFuture 线程池 commonPool 异步 真实验证 动画演示
Java 内部原理 2026-10-03

线程上下文传播

真实运行验证线程上下文传递:ThreadLocal 与 InheritableThreadLocal 在新线程、线程池复用、虚拟线程里的可见性;手工包装 Runnable;ScopedValue 在 JDK 21 预览与 JDK 27 的行为;StructuredTaskScope 传递绑定;阿里 TTL 2.14.5 的真实运行。

Java ThreadLocal ScopedValue 上下文传递 TransmittableThreadLocal 虚拟线程 真实验证 动画演示
Java 内部原理 2026-10-03

G1 Humongous Object:大对象为什么会改变回收节奏

在 JDK 21 上真实验证 G1 巨型对象:默认区域大小随堆变化(1M/2M/8M);对象大于区域一半才是巨型(正好一半不算),区域 1 MB 与 4 MB 各自验证;100 个 1126 KB 数组占用 200 MB;巨型对象在年轻代暂停里被回收。

Java G1 巨型对象 Humongous 区域大小 垃圾回收 真实验证 动画演示
Java 内部原理 2026-10-03

G1 Remembered Set:跨 Region 引用如何被追踪

在 JDK 21 上用 gc+phases=debug 真实测量老年代到新生代的引用数量对 G1 年轻代暂停的影响:脏卡 2 → 6.5 万,平均暂停 3.84 → 10.27 ms;逐行解读一次暂停里的 Merge Heap Roots、Dirty Cards、Scan Heap Roots、Redirtied Cards。

Java G1 Remembered Set 卡表 年轻代暂停 垃圾回收 真实验证 动画演示
Java 内部原理 2026-10-03

ZGC 彩色指针:引用元数据如何参与并发回收

在 JDK 21(单代与分代)与 JDK 27 上真实观察 ZGC:单代版本保留的虚拟地址空间是 -Xmx 的 16 倍再 ×3,分代与 JDK 27 没有 ×3;分配密集型负载下 ZGC 暂停最大 0.009–0.022 ms,G1 为 15.047 ms;随机链表遍历的每节点耗时对比。

Java ZGC 着色指针 多重映射 垃圾回收 暂停时间 真实验证 动画演示
Java 内部原理 2026-10-03

Shenandoah Barrier:并发压缩如何保持引用可用

在 JDK 21 与 27 上真实验证 Shenandoah 的屏障:各模式下 SATB / IU / LoadRef / CAS / Clone / Card 屏障开关的最终值,不能单独关闭;引用读与存储的耗时在各配置下几乎一样;分配密集型负载下暂停都在 0.4 ms 内。

Java Shenandoah 读屏障 SATB 垃圾回收 真实验证 动画演示
Java 内部原理 2026-10-03

字符串去重:相同字符数组如何共享

在 JDK 21 与 27 上真实验证字符串去重:30 万个内容重复的 String 使 G1 已用堆从 29.1 MB 降到 10.8 MB;五种收集器都支持;String 对象身份不变,只共享 byte[];年龄阈值为 1 时去重较早发生,3 与 10 在本实验里没有触发。

Java 字符串去重 StringDeduplication 垃圾回收 G1 真实验证 动画演示
Java 内部原理 2026-10-03

类卸载与元空间回收

真实运行验证类卸载:一个自定义加载器在没有强引用时被回收并卸载类;静态字段、ThreadLocal、线程、shutdown hook、线程池、MBean 八种泄漏都使加载器存活;-XX:-ClassUnloading 关闭卸载;五种收集器都支持;Metaspace 16 MB 下 2556 个未卸载的加载器就 OutOfMemoryError。

Java 类卸载 类加载器 Metaspace 内存泄漏 垃圾回收 真实验证 动画演示
Java 内部原理 2026-10-03

堆转储与 OQL:从对象图寻找泄漏引用

真实验证堆转储与 OQL:jcmd、jmap、HotSpotDiagnosticMXBean 的转储大小(含不可达 40.76 MB、只含存活 34.07 MB、gzip 2.41 MB);JDK 17/21 里没有 jhat;用 Eclipse MAT 1.16.1 批处理跑 OQL 查对象、字段与保留大小;MAT 默认丢弃不可达对象。

Java 堆转储 OQL Eclipse MAT jcmd jmap 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号