ENTRYPOINT 少写一对中括号,Spring Boot 的优雅停机就白开了
Dockerfile 用 shell 形式的 ENTRYPOINT 时,docker stop 的 SIGTERM 到不了 Java 进程,10 秒后直接被 SIGKILL;写对了也要让 Docker 的宽限期长过 Spring Boot 的 30 秒停机超时。用 Spring Boot 4.1.1 实测四种情况。
围绕 java 的技术文章与经验分享。
共 1030 篇文章Dockerfile 用 shell 形式的 ENTRYPOINT 时,docker stop 的 SIGTERM 到不了 Java 进程,10 秒后直接被 SIGKILL;写对了也要让 Docker 的宽限期长过 Spring Boot 的 30 秒停机超时。用 Spring Boot 4.1.1 实测四种情况。
堆固定 256M 的 Spring Boot 应用,RSS 从 268M 涨到 552M,MemoryMXBean 的 non-heap 只多了 1M。在 JDK 27 上用 NMT 的 baseline 和 summary.diff 实测,直接内存记在 Other 下面,线程栈 reserved 和 committed 差了几十倍,还顺手撞上了 MaxDirectMemorySize 默认等于 -Xmx 的 OOM。
Codex CLI 0.163.0(北京时间 10 月 16 日)支持回答中途插话转向,/config 可搜索并即时生效,/keymap 加 leader 键。另附在 codex sandbox 里跑最小 Spring Boot 测试时 Mockito 自 attach 失败,以及用 -javaagent 解决的实测记录。
用官方 tar 包起 Pulsar 5.0.0 standalone,Spring Boot 4.1.1 默认带的 4.2.4 客户端直接能收发。换成 5.0 客户端时只改版本号会先后撞上 slog 和 shade 两个报错,改用 pulsar-client-v5-all,再排除 pulsar-client-all 和 log4j-to-slf4j 两个包后跑通。
在 JDK 27 上走一遍 JMOD 示例,再用 jdeps 算出 Spring Boot 4.1.1 应用的平台模块、用 jlink 生成 60M 运行时并跑通,记录 --compress=2 弃用、JMOD 不能运行、缺 java.desktop 启动失败等坑。
JEP 544 已 Integrated,实现合入 JDK 28 EA build 20。用 Spring Boot 4.1.1 解压 jar 实测:带 AOT 代码的缓存 71M、3847 个 nmethod,5 次启动中位数 0.420 秒,只做类缓存 0.739 秒,无缓存 1.308 秒。
VS Code 1.142 稳定版到了,Agents 窗口里的聊天能直接挪进新 Git worktree,对话历史留着不用重喂。我在 Linux 上装了 1.142.0 和 Java/Spring Boot 插件,Agent 搬家按官方 release notes 写。
用 Spring Boot 4.1.1 自带的 Jackson 3.1.5 实测多参数构造器反序列化:带 -parameters 时单构造器免注解、record 非规范构造器会被使用;关掉 -parameters 后几乎全部失败、接口返回 500。
512M 的容器里不配 JVM 参数,Spring Boot 的最大堆只有 128M;把 -Xmx 设得比容器上限大,进程会被直接 OOMKilled。用 Spring Boot 4.1.1 和 JDK 21 在 Docker 里把三种情况实测了一遍。
JEP 543 进入 Proposed to Target,结构化并发将在 JDK 28 不做改动直接定稿。用 JDK 28 EA build 19 和 Spring Boot 4.1.1 实测失败取消、超时、Joiner 竞速和 JSON 线程转储。