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

注解继承与组合

真实运行验证注解的继承:@Inherited 只对类、只沿 extends 链;方法、参数与接口上的注解不继承;可重复注解加 @Inherited 时 getAnnotationsByType 与 getAnnotations 的差别;SOURCE/CLASS/RUNTIME 在 class 文件与反射里的可见性。

Java 注解 Inherited Repeatable 反射 真实验证 动画演示
Java 内部原理 2026-10-03

AtomicFieldUpdater:不增加字段就获得原子更新

真实运行验证 AtomicIntegerFieldUpdater 的使用限制与异常:必须 volatile、不能 static/final、类型要匹配;跨包的访问权限;子类里的 NoSuchFieldException;100 万对象下比 AtomicInteger 字段每对象省约 14 字节。

Java AtomicFieldUpdater CAS volatile 内存 真实验证 动画演示
Java 内部原理 2026-10-03

VarHandle 内存屏障:从访问模式到可见性

真实运行验证 VarHandle:31 种访问模式在字段、数组、byte[] 视图上的支持情况、调用类型规则与各种异常、字节码里的签名多态调用,以及消息传递小实验(没有复现重排序,如实记录)。

Java VarHandle 内存屏障 访问模式 内存模型 真实验证 动画演示
Java 内部原理 2026-10-03

@Contended 与伪共享

真实运行验证伪共享:两个线程各自自增相邻的 volatile long 约 2.98 秒,手工填充或 @Contended(需 -XX:-RestrictContended)约 0.45 秒;Unsafe 读出字段偏移,看到 JVM 重排字段与 128 字节填充;不开选项时 @Contended 在用户类里被静默忽略。

Java 伪共享 Contended 缓存行 性能 真实验证 动画演示
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 着色指针 多重映射 垃圾回收 暂停时间 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号