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

BigInteger:大整数加减乘除如何实现

实测 BigInteger:内部是大端 int[] 加独立的 signum;乘法在大数下耗时增长指数约 1.3~1.5(低于小学乘法的 2);toString 80 万位 236.08 ms,但 new BigInteger(String) 解析要 12880.87 ms(每翻倍约 4 倍);RSA 规模的 modPow 2048 位模数 1.5 ms、8192 位 77.3 ms。

Java BigInteger 大整数 乘法 真实验证 动画演示
Java 内部原理 2026-10-02

Files.mmap:内存映射文件如何工作

实测 FileChannel.map:映射 1 GB 文件时 RSS 只从 40 MB 涨到 44 MB,碰遍所有页后 1079 MB;随机读 100 万个 8 字节映射 15 ns/次、RandomAccessFile 1003 ns/次;映射写入对 Files.readAllBytes 立刻可见;单个映射不能超过 Integer.MAX_VALUE;READ_WRITE 映射会扩大文件。

Java 内存映射 mmap FileChannel 真实验证 动画演示
Java 内部原理 2026-10-02

WatchService:Java 如何监听文件变化

在 macOS 上实测 WatchService:实现是 PollingWatchService(轮询),创建文件到收到事件延迟约 2 秒([1.71, 1.99, 2.00] 秒),设成 HIGH 灵敏度没有变化;事件语义(重命名是 CREATE + DELETE、连续写合并、不递归);不调用 key.reset() 收不到后续事件。

Java WatchService 文件监听 NIO.2 真实验证 动画演示
Java 内部原理 2026-10-02

AsynchronousFileChannel:文件异步 I/O 的线程模型

验证 AsynchronousFileChannel 的线程模型:默认线程池里 CompletionHandler 运行在 Thread-N 守护线程上(这次出现了 17 个),不在调用线程;传入自定义线程池后 handler 运行在其上、线程池关闭后 read 抛 RejectedExecutionException;并发写到不同位置的内容全部正确。

Java AsynchronousFileChannel 异步 I/O NIO.2 真实验证 动画演示
Java 内部原理 2026-10-02

Unix Domain Socket:Java 如何进行本机进程通信

在 macOS 上实测 JDK 的 Unix 域套接字:地址是文件系统路径、关闭后文件不会自动删除、重复 bind 抛 BindException、路径太长抛 SocketException;1 字节来回 4.9 µs(TCP 回环 20.1 µs),但 2 GB 传输 1105 MB/s 低于 TCP 回环的 2105 MB/s。

Java Unix 域套接字 NIO 进程间通信 真实验证 动画演示
Java 内部原理 2026-10-02

DatagramChannel:UDP 和 TCP 的实现边界

在 macOS 回环上实测 DatagramChannel:数据报保留边界、缓冲区太小会截断并丢弃剩余;65507 字节能发、65508 字节抛 Message too long;接收方来不及读时 10 万个数据报在默认缓冲区只收到 4099 个、8 MB 缓冲区收到 34953 个;connect 之后写到没人监听的端口抛 PortUnreachableException,并只接收指定来源。

Java DatagramChannel UDP NIO 真实验证 动画演示
Java 内部原理 2026-10-02

WebSocket:Java 如何维持全双工连接

用 JDK 的 java.net.http.WebSocket 对 Netty 服务端做真实实验:握手的 101 响应与 Sec-WebSocket-Accept、文本与二进制、分片帧、服务端 ping、关闭握手;背压——不调用 request(n) 就收不到消息(0 次),request(2) 后收到 2 条;服务端主动 Close 4000。

Java WebSocket HttpClient Netty 真实验证 动画演示
Java 内部原理 2026-10-02

HTTP/2:帧、流和多路复用

用 curl 与自己起的 nginx(h2)验证 HTTP/2:ALPN 协商 h2、伪头部;10 个并发请求 HTTP/2 用 1 个连接、HTTP/1.1 用 10 个;流编号是奇数递增 [1, 3, 5, 7]…;用 Netty 的 HPACK 编码器,相同请求头第 1 次 136 字节、之后 7 字节(HTTP/1.1 文本 190 字节)。

Java HTTP/2 多路复用 HPACK nginx 真实验证 动画演示
Java 内部原理 2026-10-02

DNS 缓存:Java 如何缓存域名解析

实测 JVM 的 DNS 缓存(JDK 21,真实公网域名):默认第一次解析 70.58 ms、缓存命中约 0.485 ms、t=31 s 过期,与 30 秒默认值一致;networkaddress.cache.ttl=2 与 0 的效果;对不存在的域名默认也有 10 秒的负缓存(t=9 s 命中、t=11 s 过期)。

Java DNS 缓存 InetAddress networkaddress.cache.ttl 真实验证 动画演示
Java 内部原理 2026-10-02

URLClassLoader:插件系统如何动态加载 JAR

用真实的插件 jar 验证 URLClassLoader:接口由父加载器共享、插件类只在自己的加载器里;jar 自带接口且父加载器为 null 时 ClassCastException;两个加载器加载同一个 jar 得到不同的类;close() 释放文件描述符,引用清空后 GC 能卸载;插件起了线程时卸载不掉。

Java URLClassLoader 插件 类加载器 类卸载 真实验证 动画演示
Java 内部原理 2026-10-02

Module Layer:运行时如何创建隔离模块层

验证 ModuleLayer:启动层不含 greeter,新层的父层是 boot、有自己的类加载器;同一个 JVM 里同时运行 greeter 的 v1 与 v2(两个不同的 greet.Greeter 类);层内模块仍遵守 exports,ServiceLoader 可限定到某一层;重复创建得到不同的 Module,解析缺失模块抛 FindException。

Java 模块系统 ModuleLayer 隔离 真实验证 动画演示
Java 内部原理 2026-10-02

Java Instrumentation:在类加载时插入观测逻辑

用 -javaagent 实测 Instrumentation:premain 在 main 之前执行、此时已加载 809 个类、transformer 只被新加载的 6 个类调用;用 ASM 在 demo.Target 的方法入口出口插入计时(1795 µs 与 86 µs);transformer 抛异常没有任何输出、类按原样加载。

Java Instrumentation Java Agent ASM 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号