在 Java 里实际做密钥轮换:密文头部带 key id、新旧密钥并存、惰性重加密;信封加密轮换主密钥只重新包裹 DEK(71 ms 对 215 ms);两个字段分别读取会在轮换中读到不一致的 id 与密钥(失败 4.04%),不可变快照为 0;由 nonce 预算决定的轮换周期。
逐个打印 JDK 17、21、27 的默认安全参数并真实验证效果:TLSv1/1.1 与 TLS_RSA_* 默认握手失败、用 -Djava.security.properties 覆盖后成功;证书路径里 512 位 RSA 被拒绝、SHA1 的限制只对 JDK CA 锚定的链生效、收紧后 SHA1 与 1024 位失败。
用 jdeps 找出 java.base,java.logging,java.net.http,再用 jlink 裁剪运行时:从 350 MB 的完整 JDK 到 30.0 MB(strip-debug + zip-9);默认没有 CDS 归档导致 Hello 启动 40 ms 对 24 ms,加 --generate-cds-archive 追平;jdeps 看不到的反射依赖在镜像里 ClassNotFoundException;--bind-services 让镜像变成 163.1 MB。
用 jpackage 在 macOS 上真实打包:app-image 的目录结构与 Demo.cfg 配置;默认带 63 个模块 155 MB,指定 --add-modules java.base 与 jlink 选项后 30 MB;修改 cfg 立即生效;ad-hoc 签名;dmg 58 MB、pkg 52 MB;--main-class 写错要到运行时才发现。
用 jdeps 分析 netty-common、guava、commons-lang3 三个真实的库:各自需要的 JDK 模块;--jdk-internals 列出 sun.misc.Unsafe 的使用(netty 36 行、guava 22 行);多版本 jar 必须加 --multi-release;依赖图、缺失依赖;--generate-module-info;字符串反射的依赖 jdeps 看不到。
用 javap 逐项看 javac 21 的编译结果:类头与常量池(252 项)、-g 与 -parameters 的调试信息;字符串/枚举/模式 switch 与 record toString 的脱糖;字符串拼接 invokedynamic(4 条指令)对 StringBuilder(13 条);lambda、assert、finally 复制与 synchronized 的字节码。
真实运行 jshell 与 JShell API:$N 临时变量、前向引用与重新定义、错误后继续;/vars /methods /list /drop /reset;启动 1038 ms、--class-path 加载 guava;API 里 snippet 的状态、EvalException,js.stop() 在 509 ms 后中断 while (true)。
实测同一份源码怎样得到逐字节相同的 JAR:javac 同一 JDK 下是确定的、跨 JDK 版本常量池排列会不同;jar 工具要加 --date 并保持条目顺序;Maven 要设置 project.build.outputTimestamp;换 JDK 会让 manifest 的 Created-By 或 Build-Jdk-Spec 与 Main.class 不同。
写一个 javac 插件(com.sun.source.util.Plugin)检查 System.out.println 并接入真实构建:-Xplugin 的警告与错误(返回码 0 与 1)、插件参数、编译阶段事件顺序、带与不带插件 248 与 233 ms、在 Maven 的 compilerArgs 里接入(fork 为 true 与 false 都有效)。
真实运行 javadoc 的自定义标签:JDK 21 默认对 @apiNote、@implSpec 与团队自定义标签报 unknown tag(6 条错误,返回码 1);-tag 的位置字符 a/m/t/X 的效果;写一个 Taglet 用代码决定输出;自定义标签定义好后 -Xdoclint:all 不再拒绝。
同一个 jar 放在 classpath 与 module path 上的可见性差异:编译期 package is not visible、运行期 IllegalAccessException 与 InaccessibleObjectException、--add-exports 与 --add-opens 的区别;自动模块的命名;split package 在两种路径上的不同后果(含 NoClassDefFoundError);JDK 17 与 21 对内部 API 的封装。
把 Jackson + HttpServer 小程序的冷启动拆成可测阶段:到首次请求 192 ms,JVM 到 main 只有 17.0 ms,main 里初始化 140.0 ms;逐个试启动选项:AppCDS 把到 READY 从 173 降到 102 ms,只用 C1 155 ms,SerialGC 与 -UsePerfData 没有变化;类加载与 main 内的耗时分解。