Skip to content

Java 与 JVM ​

并发与内存模型、线程池与虚拟线程、类加载与 JIT、GC 调优与线上排查,以及构建工具与常用库。

从哪里开始

先读 JMM 与 happens-before 和 volatile、CAS 与 LongAdder,分清可见性、原子性与高竞争计数;再读线程池与虚拟线程;然后读 JVM 调优与线上排查,建立「先看指标、再下结论」的习惯。类加载 与 JIT 与逃逸分析 解释很多「同样的代码表现不同」的现象,按需阅读。

文章 ​

01JMM 与 happens-before多线程读写为什么看不到新值、volatile 与锁各保证什么、final 与安全发布→02volatile、CAS 与 LongAddervolatile 上的 i++ 丢了 600 多万次更新、CAS 重试让计算执行近 6 倍、ABA 何时有害、LongAdder 为什么不能做限额→03线程池参数怎么定任务接收顺序、按等待比估算起点、队列与拒绝策略、隔离与线上指标→04从 AQS 看 ReentrantLock同步队列与条件队列实测、公平锁只剩百分之一的吞吐、tryLock 插队,以及何时放弃 synchronized→05虚拟线程迁移该不该迁移、JDK 24 之后 pinning 的变化、限流职责的转移,以及怎么验证收益→06JVM 调优与线上排查堆大小与 GC 暂停的实测权衡、三条排查线、堆转储的真实代价→07G1 与 ZGC同一负载下 G1、ZGC、Parallel 的停顿、吞吐与 CPU,G1 退化到 Full GC、ZGC 分配停顿与 System.gc() 实测→08JIT 与逃逸分析同一个方法每次调用分配 0 还是 24 字节:内联、逃逸、双态与超多态调用点的实测→09对象头少了 4 字节,为什么有的对象一点没变小JDK 25 压缩对象头:字段偏移、对齐之后谁变小谁不变,一个 HashMap 实测省 16.8% 的堆→10类加载与双亲委派同名类不能互相转换、初始化时机、SPI 与上下文类加载器、子优先加载与类加载器泄漏→11Maven Scope五种 scope 在四类路径上的可见性实测,以及打包后类找不到的原因→12Java 字节码操作库选型的关键是能否跟上 JDK:旧版 CGLIB 与 Byte Buddy 在 JDK 21 上的实测结果→13对象映射方案对比MapStruct 与反射相差 100 倍的原因,以及「错误何时暴露」这个更重要的判据→14Guava EventBus异常隔离、DeadEvent、强引用泄漏与同步异步的实测边界→

文章以 CC BY-NC-SA 4.0 授权 · 代码片段以 MIT 授权