《Java 虚拟机原理与性能调优》4.2 即时编译优化:内联、逃逸分析与去虚拟化
同样的罚金计算,走单态调用是 0.74 ns/op,走四实现的多态调用是 3.44 ns/op。本节用 -XX:+PrintInlining 读内联与拒绝原因,用 -XX:-DoEscapeAnalysis 对照 GC 次数,再用 JMH 1.37 跑单态、双态与巨态分派,最后落到 libraryd 的 FinePolicy 策略设计。
tag
同样的罚金计算,走单态调用是 0.74 ns/op,走四实现的多态调用是 3.44 ns/op。本节用 -XX:+PrintInlining 读内联与拒绝原因,用 -XX:-DoEscapeAnalysis 对照 GC 次数,再用 JMH 1.37 跑单态、双态与巨态分派,最后落到 libraryd 的 FinePolicy 策略设计。
同一个 FinePolicy.fineCents,启动时跑在解释器里,几十毫秒后已经被 C2 编译。本节用 -XX:+PrintCompilation 的真实输出拆解列含义与 tier 3/4 迁移,用 jcmd Compiler.queue、Compiler.codecache 看编译队列和代码缓存,并对照 -XX:TieredStopAtLevel=1 的峰值与启动耗时。
80 万个 LoanEvent 在 1.03 秒内分配完,折合 2.5 GB/s。本节用 -Xlog:gc+tlab=debug 读 TLAB totals、用 gc+plab 看 PLAB、用 gc+region 定位 Humongous,再用 JFR 的 jdk.ObjectAllocationSample 找分配热点,最后讨论 libraryd 每请求创建 LoanEvent 的取舍。
一个 Loan 到底占多少内存?字段宽度相加是 36 字节,JOL 说是 48。本节用 JOL 0.17 打印 Book、Small、Padded、int[3]、Loan 与 FinePolicy 的对象布局,解释 mark word、压缩类指针、字段重排与 8 字节对齐,再用 -XX:-UseCompressedOops 对照,最后核算 100 万 Loan 的缓存预算。
线上 RSS 比 -Xmx 多出 1 GB,钱花在哪?本节用 MemoryShape 复现 libraryd 的线程与内存形状,跑 -XX:NativeMemoryTracking=summary 与 jcmd VM.native_memory、VM.metaspace、GC.heap_info,逐项解释 reserved/committed/used,并给出堆、元空间、直接内存与线程栈的预算表。
方法调用在 JVM 里就是一个栈帧。本节用 javap -c 的真实输出拆开局部变量表、操作数栈、动态链接与异常表,让五种调用指令各出现一次,并逐指令走完 FinePolicy.DEFAULT.fineCents(20) 的 1000 分计算过程。
class 文件变成可用的类要经过加载、链接、初始化。本节用 -Xlog:class+load 与 jcmd VM.classloaders 的输出拆开这三步,实测 Class.forName 与 loadClass 的初始化差异、两个 URLClassLoader 加载同一 jar 的类身份冲突,并落到 libraryd 的 PluginClassLoader 与 ServiceLoader。
用 javap -v -p 和 xxd 拆开 Book 与 FinePolicy 的 class 文件:magic 与 major 69、常量池的描述符与两槽常量、字段与方法表、Code/LineNumberTable/BootstrapMethods/Record 属性,并解释 record 的 toString/equals/hashCode 为何是 invokedynamic。
工具不是越多越好,每个工具只回答一类问题。本节给出 jcmd help 的真实命令清单与开销分级,实测 8 秒 JFR 记录的 summary、热点与分配视图,展示 GC 日志字段和 ManagementFactory 快照代码,并划清 JMC、MAT、async-profiler 的边界。
同一份代码在两个堆大小下会给出不同结论。本节固定 JDK、CPU、堆、GC 与启动参数,用 VM.flags 和 GC.heap_info 实测 256 MB、1 GB、2 GB 与 -Xms≠-Xmx 的差异,验证 ActiveProcessorCount 对 GC/JIT 线程数的影响,并给出 collect.sh。
libraryd 的延迟抬升不能靠猜。本节把「现象→假设→实验→证据→结论」拆成可执行步骤,用 jcmd 的 VM.info、VM.flags、GC.heap_info 真实输出演示字段怎么读,并给出症状到第一工具的对照表与四条研究路径的分工。
把 JDK、JRE、JVM 三个常被混用的概念拆开:JDK 里到底有什么、JRE 为什么从 JDK 11 起不再单独分发、JVM 的类加载器与运行时数据区各管什么;再用 javap、class 文件头和真实报错,把字节码结构、解释执行与 JIT 编译、常见类加载错误串起来。
Clojure 服务的 JVM 调优与容器化部署实践:堆与 GC 选型(G1、ZGC、Shenandoah)、关键 JVM 参数、JFR 与 JMC 诊断、容器内存与 CPU 感知、Dockerfile 分层构建与 Kubernetes 资源配置、优雅停机与健康探针。
空指针异常是 Android 线上崩溃的头号来源,Kotlin 的空安全正是为此设计。本文梳理 Kotlin 2.x 的语言基础与空安全机制:从变量声明与类型推断、可空类型与平台类型的区别,到安全调用、Elvis 运算符与 let 组成的调用链,再到智能转换、密封类穷尽分支、数据类与拷贝,以及同 Java 互操作时的空安全边界。文中给出写法对照表与常见坑清单,帮你把空指针异常挡在编译期。
系统讲解 Elasticsearch 的 JVM 与 GC 调优:堆大小与压缩指针的约束、G1 与 ZGC 的选型取舍、堆外内存与文件缓存的关系、熔断器保护机制,以及 OOM 与长时间停顿的排查路径。
GitHub Actions Java/JVM CI 实战:Maven/Gradle 构建与缓存策略、多 JDK 版本矩阵测试(8/11/17/21)、JaCoCo 代码覆盖率与 SonarCloud 集成、SpotBugs/PMD/Checkstyle 静态分析、Jib 免 Dockerfile 容器化构建、Maven 多模块 Monorepo CI、性能基准测试(JMH)自动化、发布到 Maven Central/JitPack、Kotlin/Scala 混合项目构建
讲解 ES 性能调优:JVM Heap 与 GC、Page Cache 利用、refresh 与 translog 写入调优、查询缓存与 Doc Values、Segment Merge 与慢日志。
Scala 在 JVM 上的性能调优地图:JIT 分层编译与逃逸分析、GC 选型(G1/ZGC/Shenandoah)、堆与泄漏、Scala 特有陷阱(集合/boxing/虚方法)、profiler 热点定位、fiber 并发与 JFR 可观测性。
深入 G1 RSet/SATB 与 ZGC 着色指针/读屏障内部机制,掌握 GC 日志与 Heap Dump 分析工具链,还原四个生产级调优案例的完整决策过程
深入 JVM 类加载机制与字节码:双亲委派模型、类加载器体系、字节码文件结构、Javassist/ASM 运行时字节码增强、Arthas/JFR 诊断,以及 SPI 打破双亲委派与热更新原理。