真实运行验证注解的继承:@Inherited 只对类、只沿 extends 链;方法、参数与接口上的注解不继承;可重复注解加 @Inherited 时 getAnnotationsByType 与 getAnnotations 的差别;SOURCE/CLASS/RUNTIME 在 class 文件与反射里的可见性。
真实运行验证 AtomicIntegerFieldUpdater 的使用限制与异常:必须 volatile、不能 static/final、类型要匹配;跨包的访问权限;子类里的 NoSuchFieldException;100 万对象下比 AtomicInteger 字段每对象省约 14 字节。
真实运行验证 VarHandle:31 种访问模式在字段、数组、byte[] 视图上的支持情况、调用类型规则与各种异常、字节码里的签名多态调用,以及消息传递小实验(没有复现重排序,如实记录)。
真实运行验证伪共享:两个线程各自自增相邻的 volatile long 约 2.98 秒,手工填充或 @Contended(需 -XX:-RestrictContended)约 0.45 秒;Unsafe 读出字段偏移,看到 JVM 重排字段与 128 字节填充;不开选项时 @Contended 在用户类里被静默忽略。
在 JDK 21 与 27 上真实测量锁粗化与锁消除:同一锁连续 3 个 synchronized 块 15.3 → 5.13 ns;局部 Vector 2.6 ns 对比关闭后 20–26 ns;粗化不依赖逃逸分析,消除局部对象锁两个开关都要开;字节码里没有粗化。
反射列出 java.util.concurrent.Flow 的 4 个接口;手写 Publisher 观察 request(n) 与 onNext 的真实顺序和线程、request(0)、cancel、无界请求;手写 Processor 验证需求如何向上游传递。
真实运行验证 SubmissionPublisher:容量向上取整到 2 的幂,订阅者不 request 时 submit 阻塞且阻塞期间 estimateMaximumLag 也被阻塞;offer 的返回值与 onDrop;默认在 commonPool 执行;订阅者异常、非正数 request、closeExceptionally 的行为。
真实运行验证 CompletableFuture 每一步的执行线程:thenApply 在完成者线程或调用者线程,thenApplyAsync 回到 commonPool;并行度为 1 或 0 时默认执行器变成每任务一个非守护线程;orTimeout 与 cancel 不会中断底层任务。
真实运行验证线程上下文传递:ThreadLocal 与 InheritableThreadLocal 在新线程、线程池复用、虚拟线程里的可见性;手工包装 Runnable;ScopedValue 在 JDK 21 预览与 JDK 27 的行为;StructuredTaskScope 传递绑定;阿里 TTL 2.14.5 的真实运行。
在 JDK 21 上真实验证 G1 巨型对象:默认区域大小随堆变化(1M/2M/8M);对象大于区域一半才是巨型(正好一半不算),区域 1 MB 与 4 MB 各自验证;100 个 1126 KB 数组占用 200 MB;巨型对象在年轻代暂停里被回收。
在 JDK 21 上用 gc+phases=debug 真实测量老年代到新生代的引用数量对 G1 年轻代暂停的影响:脏卡 2 → 6.5 万,平均暂停 3.84 → 10.27 ms;逐行解读一次暂停里的 Merge Heap Roots、Dirty Cards、Scan Heap Roots、Redirtied Cards。
在 JDK 21(单代与分代)与 JDK 27 上真实观察 ZGC:单代版本保留的虚拟地址空间是 -Xmx 的 16 倍再 ×3,分代与 JDK 27 没有 ×3;分配密集型负载下 ZGC 暂停最大 0.009–0.022 ms,G1 为 15.047 ms;随机链表遍历的每节点耗时对比。