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

Attach API:如何连接一个正在运行的 JVM

真实 attach 到另一个 JVM:list() 发现目标、attach 用时 113 ms 并创建 .java_pid 套接字文件、读取系统属性、loadAgent 在目标进程的 Attach Listener 线程里执行 agentmain 并改写目标静态变量;JDK 21 动态加载 agent 会打印 4 行 WARNING;attach 到非 JVM、自己、不存在的 jar 各抛什么异常。

Java Attach API 动态 Agent 诊断 真实验证 动画演示
Java 内部原理 2026-10-03

JFR:用事件流观察 JVM 的运行状态

真实录制 3 秒的 JFR:文件 575 KB、185 种事件;jfr print 看 GC 事件(22 条,第一条 1.22 ms)和锁争用事件(240 条,带 previousOwner 与阻塞线程的栈);ExecutionSample 在这台 macOS 上只有 0 条(没有用来找热点);default 与 profile 配置的采样周期与阈值对比。

Java JFR Flight Recorder 诊断 真实验证 动画演示
Java 内部原理 2026-10-03

JMX:把 JVM 指标变成可管理的 MBean

真实验证 JMX:平台 MBeanServer 有 27 个 MBean(读属性、调 findDeadlockedThreads);注册自己的 Standard MBean 的属性、操作与五种异常;属性变化通知在调用线程里同步发出;远程连接 105 ms、远程 getAttribute 平均 146.69 µs/次。

Java JMX MBean 诊断 真实验证 动画演示
Java 内部原理 2026-10-03

NMT:追踪 JVM 堆外内存去了哪里

用 -XX:NativeMemoryTracking=summary 和 jcmd VM.native_memory 分阶段观察:100 MB DirectByteBuffer 让 Other 变成 100.0 MB,300 个线程让 Thread 从 36.3 涨到 642.7 MB(但 RSS 只涨 37 MB),5000 个类让 Metaspace 涨到 10.9 MB;committed 与 RSS 是两个不同的数。

Java NMT 堆外内存 jcmd 诊断 真实验证 动画演示
Java 内部原理 2026-10-03

GCLocker:JNI 临界区为什么会拖住垃圾回收

用自己编译的 JNI 函数验证 GCLocker:JDK 21 的 G1 与 Parallel 在 JNI 临界区(600 ms)期间分配线程最长被卡 610.1 / 592.4 ms(无临界区约 1.4 ms);JDK 27 的 G1 不再被卡(0.6 ms),Parallel 仍被卡(604.0 ms)。

Java GCLocker JNI 垃圾回收 真实验证 动画演示
Java 内部原理 2026-10-03

Epsilon GC:只分配不回收有什么用

验证 Epsilon GC:已用堆只增不减、堆满时 JVM 以退出码 3 直接终止且 OutOfMemoryError 不可捕获;2000 万个短命数组的循环里 Epsilon 161 ms,反而比 Serial 92 ms、Parallel 87 ms 慢;引用存储 0.346 ns,比 G1 的 1.473 ns 便宜。

Java Epsilon GC 垃圾回收 JVM 真实验证 动画演示
Java 内部原理 2026-10-03

Parallel GC:吞吐优先的并行垃圾收集器

JDK 21 上实测 Parallel GC:ParallelGCThreads 从 1 到 8,年轻代停顿中位数 69.0 → 22.2 ms;同一个大存活集负载下 Parallel 完成 395,987 个循环、G1 456,530、Serial 196,885(Parallel 没有赢过 G1);默认 GCTimeRatio = 99 的目标是 1% 的 GC 时间,实际 45.1%。

Java Parallel GC 垃圾回收 吞吐 真实验证 动画演示
Java 内部原理 2026-10-03

ObjectInputFilter:给 Java 反序列化加一道类型边界

防御性验证 Java 反序列化过滤器:白名单("!*" 拒绝其余)与黑名单的区别;maxdepth、maxarray、maxrefs、maxbytes 各自拦住什么;进程级过滤器只能设置一次、流上的过滤器取代它、自定义过滤器与 merge、rejectUndecidedClass。只用无害的自定义类实验。

Java ObjectInputFilter 反序列化 安全 真实验证 动画演示
Java 内部原理 2026-10-03

Security Provider:Java 加密算法如何找到实现

验证 Java 加密提供者机制:JDK 21 安装了 13 个提供者(SUN、SunRsaSign、SunEC、SunJCE…),getInstance 按顺序选第一个有该算法的;别名、OID 与大小写;各种 NoSuchAlgorithm/NoSuchProvider 错误;Cipher.getInstance("AES") 默认 ECB;自定义提供者 insertProviderAt(…, 1) 接管 SHA-256,构造器非 public 时被静默跳过。

Java Security Provider JCA 加密 真实验证 动画演示
Java 内部原理 2026-10-03

KeyStore:管理密钥与证书的容器边界

验证 KeyStore:JDK 21 默认 pkcs12,PKCS12 文件头 308203da 与 JKS 的 feedfeed 可自动识别;两种格式密码错误的信息;JKS 私钥有独立密码、不能存对称密钥,PKCS12 可以;TrustedCertificateEntry;JDK 自带 cacerts 有 111 个受信任根证书。

Java KeyStore PKCS12 JKS cacerts 真实验证 动画演示
Java 内部原理 2026-10-03

Unicode 与 Charset:字符、代码点和字节不要混为一谈

Java 里字符、码点、字素、字节是四件事:😀 length 为 2,家庭 emoji length 8 却只有 1 个字素;错误解码得到乱码、损坏字节被替换成 U+FFFD;JDK 17 默认字符集跟随系统而 JDK 21 固定 UTF-8;规范化与 toUpperCase 的长度变化、土耳其语 i。

Java Unicode Charset 字符集 Normalizer 真实验证 动画演示
Java 内部原理 2026-10-03

Collator:按语言规则比较文本

用 java.text.Collator 做按语言规则的排序:String 自然顺序把 Äpfel、éclair 排到最后,Collator 不会;strength 决定什么算相等;Locale.CHINA 的汉字排序与拼音一致;20000 个字符串排序 compare 97 ms、CollationKey 23 ms、自然顺序 4 ms。

Java Collator 排序 本地化 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号