<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java 虚拟机 on PlumePHP</title><link>https://plumephp.com/tags/java-%E8%99%9A%E6%8B%9F%E6%9C%BA/</link><description>Recent content in Java 虚拟机 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 28 Oct 2026 10:15:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/java-%E8%99%9A%E6%8B%9F%E6%9C%BA/index.xml" rel="self" type="application/rss+xml"/><item><title>《Java 虚拟机原理与性能调优》 · 全书目录与章节索引（31 篇）</title><link>https://plumephp.com/posts/books/java%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%8E%9F%E7%90%86/</link><pubDate>Wed, 28 Oct 2026 10:15:00 +0800</pubDate><guid>https://plumephp.com/posts/books/java%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%8E%9F%E7%90%86/</guid><description>《Java 虚拟机原理与性能调优》全 31 篇，承接卷三 libraryd，用 jcmd、JFR、GC 日志与堆转储讲清类加载、对象布局、JIT、垃圾回收、内存诊断、线程锁运行时、启动加速与综合压测调优：10 章 30 节加目录的完整索引。</description></item><item><title>《Java 虚拟机原理与性能调优》目录与学习路径</title><link>https://plumephp.com/java-jvm-toc/</link><pubDate>Wed, 28 Oct 2026 10:10:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-toc/</guid><description>《Java 虚拟机原理与性能调优》全 31 篇的目录与学习路径：10 章 30 节，从研究方法、类文件与对象布局，到 JIT、GC、内存诊断、线程与锁、启动加速和综合压测调优，给出三条按症状跳读的路线、统一实验口径、项目状态、机器口径与各卷衔接。</description></item><item><title>《Java 虚拟机原理与性能调优》10.3 建立回归基线与容量规划</title><link>https://plumephp.com/java-jvm-10-3-baseline-capacity/</link><pubDate>Wed, 28 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-10-3-baseline-capacity/</guid><description>把启动、吞吐、p50/p95/p99、GC 次数与停顿、堆占用写成一份基线 JSON，用 scripts/jvm/baseline.py 采集并对比。本节真跑两次基线得到 PASS，再用 -Xint 制造回归得到 FAIL，并用 Little 定律和 p99 曲线给出 libraryd 的容量表与扩容触发条件。</description></item><item><title>《Java 虚拟机原理与性能调优》10.2 一次完整的调优：从现象到参数</title><link>https://plumephp.com/java-jvm-10-2-tuning-case/</link><pubDate>Wed, 28 Oct 2026 09:50:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-10-2-tuning-case/</guid><description>报告端点 p99 40 到 57ms，团队第一反应是加 -Xms2g -Xmx2g -XX:MaxGCPauseMillis=50。本节按现象、证据、假设、改动、回归走一遍，实测三组参数与并发曲线，结论是 GC 停顿只占 p99 的 5%，真正有效的是限制单实例在途请求。</description></item><item><title>《Java 虚拟机原理与性能调优》10.1 压测设计与指标口径：吞吐、分位与协调缺失</title><link>https://plumephp.com/java-jvm-10-1-load-testing/</link><pubDate>Wed, 28 Oct 2026 09:40:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-10-1-load-testing/</guid><description>同样 5000 个请求、50 并发，ab 不带 -k 是 1909 req/s、p99 78ms，带 -k 是 10201 req/s、p99 17ms。本节用这两份真实输出讲吞吐、均值、分位、连接复用与协调缺失，并用 Little 定律和开环压测器说明为什么并发不是越高越好。</description></item><item><title>《Java 虚拟机原理与性能调优》9.3 AOT 缓存与 Native Image：边界与取舍</title><link>https://plumephp.com/java-jvm-09-3-aot-native-image/</link><pubDate>Wed, 28 Oct 2026 09:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-09-3-aot-native-image/</guid><description>JDK 25 的 AOT 缓存分 record、create、run 三阶段，缓存类链接结果和方法 profile，不是机器码。本节实测归档大小、目录 classpath 的失败、create 阶段漏传 classpath 的报错与 jar 变更后的降级行为，并把 AOT 缓存、AppCDS 与 GraalVM Native Image 的适用边界分开。</description></item><item><title>《Java 虚拟机原理与性能调优》9.2 CDS 与 AppCDS：共享归档的构建与验证</title><link>https://plumephp.com/java-jvm-09-2-cds-appcds/</link><pubDate>Wed, 28 Oct 2026 09:20:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-09-2-cds-appcds/</guid><description>默认 CDS 已经把 JDK 核心类放进共享归档，AppCDS 只负责应用类。本节用 -Xshare:dump、ArchiveClassesAtExit、SharedArchiveFile 和 jcmd VM.cds 实测归档大小与启动差异，并给出目录 classpath 失败、相对路径失效和 -Xshare:on 硬失败的处理方式。</description></item><item><title>《Java 虚拟机原理与性能调优》9.1 启动耗时分解：类加载、解释执行与首请求</title><link>https://plumephp.com/java-jvm-09-1-startup-profiling/</link><pubDate>Wed, 28 Oct 2026 09:10:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-09-1-startup-profiling/</guid><description>把 libraryd 的启动拆成进程启动、VM 初始化、类加载、main 返回和首请求五个时间点。本节用 startuptime、class+load、JFR ClassLoad 与十次重复测量，给出 Hello 与最小 HTTP 服务的真实分布，并解释 readiness 通过为什么不等于首请求就绪。</description></item><item><title>《Java 虚拟机原理与性能调优》8.3 虚拟线程的运行时：Continuation、载体与调度</title><link>https://plumephp.com/java-jvm-08-3-virtual-thread-runtime/</link><pubDate>Wed, 28 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-08-3-virtual-thread-runtime/</guid><description>1000 个虚拟线程只对应 2 个载体，这是怎么做到的？本节用 Thread.vthread_scheduler、JSON 线程容器和 pin 心跳实验拆开 Continuation、mount/unmount 与调度，验证 JDK 25 的 synchronized 不再 pin，而本地调用和类初始化仍会占住载体。</description></item><item><title>《Java 虚拟机原理与性能调优》8.2 锁的运行时实现：对象头、Monitor 与膨胀</title><link>https://plumephp.com/java-jvm-08-2-lock-runtime/</link><pubDate>Wed, 28 Oct 2026 08:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-08-2-lock-runtime/</guid><description>JDK 25 已经没有偏向锁。本节用 PrintFlagsFinal 确认 UseBiasedLocking 消失，用 javap 看 synchronized 方法与方法块的字节码差异，再用 JFR 记录 JavaMonitorEnter、Wait 与 Inflate，对比 synchronized 和 ReentrantLock 的真实竞争事件。</description></item><item><title>《Java 虚拟机原理与性能调优》8.1 线程栈与转储：从 jstack 到 JSON 线程容器</title><link>https://plumephp.com/java-jvm-08-1-thread-stacks/</link><pubDate>Wed, 28 Oct 2026 08:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-08-1-thread-stacks/</guid><description>jstack 看不到虚拟线程。本节用 1000 个虚拟线程加 4 个平台工作线程实测 Thread.print 与 Thread.dump_to_file，读出 JSON 里的 root、ThreadPerTaskExecutor 与 ForkJoinPool 容器，并给出死锁检测、线程状态判断和 libraryd 的转储脚本。</description></item><item><title>《Java 虚拟机原理与性能调优》7.3 元空间与直接内存：类生成与堆外泄漏</title><link>https://plumephp.com/java-jvm-07-3-metaspace-direct-memory/</link><pubDate>Wed, 28 Oct 2026 07:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-07-3-metaspace-direct-memory/</guid><description>堆没满、进程却一直涨，问题常在 -Xmx 之外。本节用 Byte Buddy 1.18.16 生成类，在 64 MB 元空间上限下复现真实 Metaspace OOM；再用 32 MB 直接内存上限复现 Cannot reserve 报错，并给出 VM.metaspace、NMT 与插件热重载的排查路径。</description></item><item><title>《Java 虚拟机原理与性能调优》7.2 内存泄漏定位：增长曲线、直方图与引用链</title><link>https://plumephp.com/java-jvm-07-2-leak-hunting/</link><pubDate>Wed, 28 Oct 2026 07:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-07-2-leak-hunting/</guid><description>内存一直涨不等于泄漏。本节用 -Xmx64m 把一个 static Map 逼到真实 OutOfMemoryError，采样出 13 MB 到 67 MB 的线性增长曲线，用直方图盯住 [B 的实例与字节，并用 WeakHashMap 实验说明弱引用为什么救不了值反向持有键的缓存。</description></item><item><title>《Java 虚拟机原理与性能调优》7.1 堆转储与支配树：从 hprof 到保留大小</title><link>https://plumephp.com/java-jvm-07-1-heap-dump-dominator/</link><pubDate>Wed, 28 Oct 2026 06:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-07-1-heap-dump-dominator/</guid><description>堆转储不是截一张内存快照就完事。本节用 500 个 64 KB 数组实测 jcmd GC.heap_dump 生成 37 MB hprof，讲清 shallow size、retained size 与支配树，给出 GC Root 路径的读法、MAT 操作步骤和 libraryd 的 dump 落盘策略。</description></item><item><title>《Java 虚拟机原理与性能调优》6.3 ZGC 与低延迟取舍：染色指针、读屏障与停顿</title><link>https://plumephp.com/java-jvm-06-3-zgc-low-latency/</link><pubDate>Wed, 28 Oct 2026 06:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-06-3-zgc-low-latency/</guid><description>ZGC 的停顿为什么和堆大小基本无关？染色指针与读屏障到底做了什么？本节用本机 10 秒 G1 与 ZGC 对照实验拆开停顿、MMU、Allocation Stall 与 RSS，并说明换收集器前要算清的三笔账，读完能判断什么时候该换、换了要付什么代价。</description></item><item><title>《Java 虚拟机原理与性能调优》6.2 G1 调优：Region、Humongous 与 Mixed GC</title><link>https://plumephp.com/java-jvm-06-2-g1-tuning/</link><pubDate>Tue, 27 Oct 2026 23:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-06-2-g1-tuning/</guid><description>G1 的 region 到底多大？多大的对象算 Humongous？IHOP 和 MaxGCPauseMillis 改了为什么没效果？本节用本机实测拆开 Region、Humongous、Mixed GC 与停顿目标，并给出 libraryd 导出任务避开大对象的写法。</description></item><item><title>《Java 虚拟机原理与性能调优》6.1 GC 日志解析：统一日志、停顿指标与分配失败</title><link>https://plumephp.com/java-jvm-06-1-gc-logs/</link><pubDate>Tue, 27 Oct 2026 22:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-06-1-gc-logs/</guid><description>一行 GC(9) Pause Young (Mixed) 431M-&gt;313M(512M) 0.964ms 里每个字段是什么意思？本节用本机 12 秒真实日志拆字段、讲标签、复现 Evacuation Failure，并给出解析停顿的 gc-summary.py。</description></item><item><title>《Java 虚拟机原理与性能调优》5.3 收集器谱系：Serial、Parallel、G1、ZGC 与 Shenandoah</title><link>https://plumephp.com/java-jvm-05-3-collector-family/</link><pubDate>Tue, 27 Oct 2026 21:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-05-3-collector-family/</guid><description>五种收集器在同一台 M1 Pro、同一份负载下的真实对照：Serial 与 Parallel 的日志形状、G1 的 region、ZGC 的 0.053ms 最大停顿和 Shenandoah 的 256K region，附选型表与可复现命令。</description></item><item><title>《Java 虚拟机原理与性能调优》5.2 分代假设与回收算法：复制、标记与整理</title><link>https://plumephp.com/java-jvm-05-2-gc-algorithms/</link><pubDate>Tue, 27 Oct 2026 20:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-05-2-gc-algorithms/</guid><description>同样一段分配负载，Serial 打印 DefNew/Tenured，Parallel 打印 PSYoungGen/ParOldGen，G1 打印的是一串 region 计数。本节用三份真实 GC 日志拆开分代假设、三种回收算法与晋升年龄，并在 -Xmx64m 下量出年龄表最高只到 age 6。</description></item><item><title>《Java 虚拟机原理与性能调优》5.1 可达性分析与引用类型：从 GC Root 到 Cleaner</title><link>https://plumephp.com/java-jvm-05-1-reachability-references/</link><pubDate>Tue, 27 Oct 2026 19:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-05-1-reachability-references/</guid><description>libraryd 的 LoanCache 清了引用还占着 1.2 GB。本节用 GC Root 实验、弱/软/虚引用与 Cleaner 的真实输出，量出 -Xmx64m 下软引用只剩 16/4096，并解释 WeakHashMap 为什么留不住条目。</description></item><item><title>《Java 虚拟机原理与性能调优》4.3 反优化与 OSR：代码什么时候退回解释器</title><link>https://plumephp.com/java-jvm-04-3-deoptimization/</link><pubDate>Tue, 27 Oct 2026 18:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-04-3-deoptimization/</guid><description>加载一个插件类，热了五分钟的接口调用突然退回解释器。本节用 -XX:+PrintCompilation 抓 marked for deoptimization 与 uncommon trap，用 JFR 的 jdk.Deoptimization 事件看 class_check 的 bci、原因与动作，再解释 OSR 为什么在循环中途换代码，以及 libraryd 插件热加载该怎么避开反优化。</description></item><item><title>《Java 虚拟机原理与性能调优》4.2 即时编译优化：内联、逃逸分析与去虚拟化</title><link>https://plumephp.com/java-jvm-04-2-jit-optimizations/</link><pubDate>Tue, 27 Oct 2026 17:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-04-2-jit-optimizations/</guid><description>同样的罚金计算，走单态调用是 0.74 ns/op，走四实现的多态调用是 3.44 ns/op。本节用 -XX:+PrintInlining 读内联与拒绝原因，用 -XX:-DoEscapeAnalysis 对照 GC 次数，再用 JMH 1.37 跑单态、双态与巨态分派，最后落到 libraryd 的 FinePolicy 策略设计。</description></item><item><title>《Java 虚拟机原理与性能调优》4.1 解释执行与分层编译：C1、C2 与阈值</title><link>https://plumephp.com/java-jvm-04-1-tiered-compilation/</link><pubDate>Tue, 27 Oct 2026 16:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-04-1-tiered-compilation/</guid><description>同一个 FinePolicy.fineCents，启动时跑在解释器里，几十毫秒后已经被 C2 编译。本节用 -XX:+PrintCompilation 的真实输出拆解列含义与 tier 3/4 迁移，用 jcmd Compiler.queue、Compiler.codecache 看编译队列和代码缓存，并对照 -XX:TieredStopAtLevel=1 的峰值与启动耗时。</description></item><item><title>《Java 虚拟机原理与性能调优》3.3 分配与 TLAB：指针碰撞、线程本地缓冲与大对象</title><link>https://plumephp.com/java-jvm-03-3-allocation-tlab/</link><pubDate>Tue, 27 Oct 2026 15:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-03-3-allocation-tlab/</guid><description>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 的取舍。</description></item><item><title>《Java 虚拟机原理与性能调优》3.2 对象布局：对象头、压缩指针与字段重排</title><link>https://plumephp.com/java-jvm-03-2-object-layout/</link><pubDate>Tue, 27 Oct 2026 14:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-03-2-object-layout/</guid><description>一个 Loan 到底占多少内存？字段宽度相加是 36 字节，JOL 说是 48。本节用 JOL 0.17 打印 Book、Small、Padded、int[3]、Loan 与 FinePolicy 的对象布局，解释 mark word、压缩类指针、字段重排与 8 字节对齐，再用 -XX:-UseCompressedOops 对照，最后核算 100 万 Loan 的缓存预算。</description></item><item><title>《Java 虚拟机原理与性能调优》3.1 运行时数据区：堆、栈、元空间与代码缓存</title><link>https://plumephp.com/java-jvm-03-1-runtime-data-areas/</link><pubDate>Tue, 27 Oct 2026 13:30:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-03-1-runtime-data-areas/</guid><description>线上 RSS 比 -Xmx 多出 1 GB，钱花在哪？本节用 MemoryShape 复现 libraryd 的线程与内存形状，跑 -XX:NativeMemoryTracking=summary 与 jcmd VM.native_memory、VM.metaspace、GC.heap_info，逐项解释 reserved/committed/used，并给出堆、元空间、直接内存与线程栈的预算表。</description></item><item><title>《Java 虚拟机原理与性能调优》2.3 字节码执行模型：栈帧、局部变量表与操作数栈</title><link>https://plumephp.com/java-jvm-02-3-bytecode-execution/</link><pubDate>Tue, 27 Oct 2026 13:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-02-3-bytecode-execution/</guid><description>方法调用在 JVM 里就是一个栈帧。本节用 javap -c 的真实输出拆开局部变量表、操作数栈、动态链接与异常表，让五种调用指令各出现一次，并逐指令走完 FinePolicy.DEFAULT.fineCents(20) 的 1000 分计算过程。</description></item><item><title>《Java 虚拟机原理与性能调优》2.2 类加载过程：加载、链接、初始化与双亲委派</title><link>https://plumephp.com/java-jvm-02-2-class-loading-lifecycle/</link><pubDate>Tue, 27 Oct 2026 12:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-02-2-class-loading-lifecycle/</guid><description>class 文件变成可用的类要经过加载、链接、初始化。本节用 -Xlog:class+load 与 jcmd VM.classloaders 的输出拆开这三步，实测 Class.forName 与 loadClass 的初始化差异、两个 URLClassLoader 加载同一 jar 的类身份冲突，并落到 libraryd 的 PluginClassLoader 与 ServiceLoader。</description></item><item><title>《Java 虚拟机原理与性能调优》2.1 类文件结构：常量池、方法表与属性</title><link>https://plumephp.com/java-jvm-02-1-classfile-structure/</link><pubDate>Tue, 27 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-02-1-classfile-structure/</guid><description>用 javap -v -p 和 xxd 拆开 Book 与 FinePolicy 的 class 文件：magic 与 major 69、常量池的描述符与两槽常量、字段与方法表、Code/LineNumberTable/BootstrapMethods/Record 属性，并解释 record 的 toString/equals/hashCode 为何是 invokedynamic。</description></item><item><title>《Java 虚拟机原理与性能调优》1.3 观测工具全景：jcmd、JFR、GC 日志与 JMC</title><link>https://plumephp.com/java-jvm-01-3-observability-tools/</link><pubDate>Tue, 27 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-01-3-observability-tools/</guid><description>工具不是越多越好，每个工具只回答一类问题。本节给出 jcmd help 的真实命令清单与开销分级，实测 8 秒 JFR 记录的 summary、热点与分配视图，展示 GC 日志字段和 ManagementFactory 快照代码，并划清 JMC、MAT、async-profiler 的边界。</description></item><item><title>《Java 虚拟机原理与性能调优》1.2 建立可复现的实验环境：CPU、堆与固定参数</title><link>https://plumephp.com/java-jvm-01-2-experiment-environment/</link><pubDate>Tue, 27 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-01-2-experiment-environment/</guid><description>同一份代码在两个堆大小下会给出不同结论。本节固定 JDK、CPU、堆、GC 与启动参数，用 VM.flags 和 GC.heap_info 实测 256 MB、1 GB、2 GB 与 -Xms≠-Xmx 的差异，验证 ActiveProcessorCount 对 GC/JIT 线程数的影响，并给出 collect.sh。</description></item><item><title>《Java 虚拟机原理与性能调优》1.1 从现象到机制：JVM 研究的四条路径</title><link>https://plumephp.com/java-jvm-01-1-research-method/</link><pubDate>Tue, 27 Oct 2026 08:00:00 +0800</pubDate><guid>https://plumephp.com/java-jvm-01-1-research-method/</guid><description>libraryd 的延迟抬升不能靠猜。本节把「现象→假设→实验→证据→结论」拆成可执行步骤，用 jcmd 的 VM.info、VM.flags、GC.heap_info 真实输出演示字段怎么读，并给出症状到第一工具的对照表与四条研究路径的分工。</description></item></channel></rss>