{
 "date": "2026-10-25",
 "timezone": "Asia/Shanghai",
 "issue": 51,
 "batch": "U14",
 "sourceTags": "OpenJDK jdk-17.0.12+7（Terminator.java/Shutdown.java/os.cpp/signals_posix.cpp/os_linux.cpp 摘录基线）；运行 JDK 为 Oracle JDK 17.0.12+8-LTS-286，构建号不同，不把运行说成源码 tag 实测",
 "environment": {
  "os": "macOS 26.7.1 (25G241, x86_64)",
  "architecture": "x86_64",
  "jdk17": "Oracle JDK 17.0.12+8-LTS-286（/Library/Java/JavaVirtualMachines/jdk-17.jdk；/usr/libexec/java_home -v17 当前解析到 GraalVM 17.0.12+8.1，JVMCI 额外占 fd，本票实验显式 JAVA_HOME 指向 Oracle jdk-17.jdk）",
  "docker": "本机无 docker/podman/colima/lima/orbctl——Linux 专属行为（/proc/PID/*、cgroup v1/v2 控制器、OOM killer、CAP_*、SCHED_*）全部按 man 手册/内核文档/OpenJDK 源码推导并逐项标注未实跑",
  "runPolicy": "调用方 perl alarm 90–240 秒上限；run.py 每模式独立 JVM、subprocess timeout 60–90 秒、唯一 TemporaryDirectory 自动清理；fd 模式用 resource.setrlimit 只降低子进程 RLIMIT_NOFILE（不触全局）；perm 模式 preexec os.umask(0o027) 仅子进程；线程实验只占本进程 task 槽位（kern.num_taskthreads=4096）"
 },
 "tdd": {
  "redGreen": [
   "红1（『非 root 绑定 1024 以下端口必失败』的 Linux 认知当跨平台规则）：PermSpike/perm 模式在 macOS 以 uid=501 bind(80) 实测 BIND80=ok——macOS（10.14+）允许非特权绑定低端口；绿：perm 模式把 BIND80 记录为平台相关观察（ok/denied 均算通过），Linux 侧 EACCES/CAP_NET_BIND_SERVICE 语义按 capabilities(7) 推导并标注未实跑。",
   "红2（『SIGQUIT 会终止 JVM』的误解）：signal 模式初版断言 QUIT 后进程退出，实测 dump 输出『Full thread dump …』后进程仍存活、需另行 kill；绿：runner 断言 alive=true 且 stdout 含 Full thread dump 与 \"main\" 线程行（os.cpp SIGBREAK 分支只打印不退出）。",
   "红3（『512MiB 堆装得下 300×1MiB 数组』的容量直觉）：MemSpike 在 -Xms256m -Xmx512m 下循环第 7 次分配即 OutOfMemoryError: Java heap space——1MiB 数组在 G1 默认 Region（~1MiB）下是 humongous，各需 2 个连续 Region，300 个需 ~600MiB 连续 Region 空间；改 256KB×400（非 humongous）+ -Xmx512m 后 mem 模式转绿。JVM/GC 侧机制权威在 U11 GC 正文，本票只作 OS 内存观测反例。",
   "红4（『64 个 fd 足够 JVM 启动』的环境假设）：RLIMIT_NOFILE=64 下 GraalVM 17.0.12 启动即 fatal error（jvmci.cpp:92 dlopen libjvmcicompiler.dylib errno=24）；绿：fd 模式固定 Oracle JDK 17.0.12 并把限制定为 80（启动后余量 ~5，EMFILE 在第 77 次打开触发）。fd 模式对 JVMCI 发行版有最低 fd 前提，README 登记。",
   "红5（『createFile 显式指定权限属性会绕过 umask / umask 只作用于默认创建』的误解）：runner 初版按『请求 666 & umask 027 = 640』断言，实测 CREATED=rwxr-x---（750）——请求值是 rwxrwxrwx(777)，umask 作用于请求值本身：777 & ~027 = 750；绿：runner 断言 symbolic_mode(0o777 & ~0o027)，探针断言 CREATED==EXPECTED。",
   "红6（『RSS≈Java 堆使用量』的对账误解）：mem 模式实测 heapUsed=133MB、RSS 31MB→175MB、NMT total committed=339MB（其中 heap committed=232MB）——RSS 同时含非堆 native 且 committed≠resident（RSS 175MB < heap committed 232MB）；绿：断言 rss_after-rss_before>=50MB 且 rss_after>heapUsed，数值只作单机观察。",
   "红7（『jstack nid 条数==Java activeCount』的计数误解）：ParkProbe 8 条驻留线程 activeCount=9，jstack 解析出 27 条 nid=——JVM 自身（GC/JIT/Signal Dispatcher 等）线程也在列表里；绿：只断言 nid 计数 >= activeCount，并记录 macOS ps -M 无线程 id 列（nid↔TID 十六进制转换是 Linux 专属口径，按 jstack 文档与 proc_pid_status(5) 推导）。",
   "红8（『GC 会回收文件描述符』的误解）：fd 模式 hold 相位持有 76 个 FileInputStream，System.gc()+200ms 后重试打开 20 个全部 EMFILE（GC_RETRY_OPENED=0）——FD 不是 GC 对象管理的资源；绿：断言 retry==0，close 相位 try-with-resources 200/200 成功。"
  ],
  "devFixes": "开发期修复如实记录不计红绿：(1) mem 模式初版在读取 PHASE=before 后 2.5s 才采样基线 RSS，分配已发生（RSS 增量 0 KB 断言失败），探针改为分配前 sleep 2s、runner 改 0.5s 采样；(2) DiskSpike 初版在 Files.delete 后对已删除路径调 getFileStore 抛 NoSuchFileException，改为按目录取 FileStore；(3) jstack/jcmd attach 在探针即刻退出时报 10.5s 超时，探针延长驻留时间；(4) run.py 底部 import 误置与误造 API 导致语法错误，整体重写为顶部 import + symbolic_mode 纯计算。这些是脚本/断言缺陷不是误解断言。",
  "noFakeRed": "八次红均为先按常见误解/Linux 认知写下真实预期后被 macOS 实测推翻（低端口绑定、SIGQUIT 退出、humongous 容量、fd 启动下限、umask 绕过、RSS≈堆、nid==Java 线程数、GC 收 FD），随后按实测/源码分支修正转绿，不倒造 red。"
 },
 "runs": [
  {
   "name": "all-final",
   "command": ["python3", "labs/os-network/run.py", "all"],
   "env": {"JAVA_HOME": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home"},
   "startedLocal": "2026-10-25 11:4x (Asia/Shanghai, perl alarm 240s)",
   "timedOut": false,
   "exit": 0,
   "stdoutSummary": "十一模式全绿：budget/tcp/selector/http/dns 为 U12 既有基线原样复跑（PASS×8 含 dns 三相位）；thread 新增——OOME_AT created=4069 active=4070，PASS（kern.num_taskthreads=4096）；signal 新增——PASS TERM=hook+143, KILL=no-hook+-9, QUIT=dump+survive, XRS+TERM=no-hook+-15；fd 新增——EMFILE_AT opened=76、GC_RETRY_OPENED=0、OPENED_ALL_CLOSED opened=200；mem 新增——heapUsed=133MB RSS 31064→173936KB NMT total=339295KB heap=232448KB；perm 新增——CREATED=rwxr-x--- EXPECTED=rwxr-x---、READ000=denied、BIND80=ok（平台观察）；disk 新增——USABLE_MB withFile=250305 deletedWhileOpen=250305、STILL_READABLE=true、FSYNC_US=[21081..22293]µs。",
   "tmpLeft": 0,
   "stabilityNote": "线程停止点（4069）、EMFILE 阈值（76）、RSS/NMT/FSYNC 数值均为单机观察值非契约；断言只压方向与阈值（OOME_AT>=1000、opened<200、GC_RETRY_OPENED==0、RSS 增量>=50MB、deletedWhileOpen==withFile）。hook 运行与否、退出码 143/-9、SIGQUIT 存活、-Xrs 行为、umask 掩蔽、000 拒读、删除后仍可读为规范/源码行为断言。"
  },
  {
   "name": "mode-first-greens",
   "command": [["python3", "labs/os-network/run.py", "perm"], ["python3", "labs/os-network/run.py", "disk"], ["python3", "labs/os-network/run.py", "fd"], ["python3", "labs/os-network/run.py", "signal"], ["python3", "labs/os-network/run.py", "mem"], ["python3", "labs/os-network/run.py", "thread"]],
   "env": {"JAVA_HOME": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home"},
   "exit": 0,
   "note": "2026-10-25 11:2x–11:3x 六模式独立直跑各 exit 0（perm 首跑为红5 后修正；mem 首跑为 devFix(1) 后修正；fd 首跑为红4 后以 Oracle JDK+限制 80 转绿）"
  },
  {
   "name": "spikes",
   "command": ["/tmp/u14-spike 下的一次性 spike：ThreadSpike(-Xss512k, EAGAIN@4070, ~5.5s)", "RunFd3.py（Oracle JDK 17 在 nofile 80/96/128/160 下分别 EMFILE 于 76/92/124/156 次打开）", "PermSpike（umask 027、BIND80=ok、chmod 000 AccessDeniedException）", "MemSpike2/MemSpike4（-Xmx384m 200×1MiB OOME；-Xmx512m 400×256KB RSS 162068KB/heapUsed=133MB）", "ParkProbe+jstack（activeCount=9 vs nid=27；ps -M 首列 USER 无线程 id）", "DiskSpike（base/withFile/deletedWhileOpen=250356/250292/250292MB；close 后 1.2s freeDelta=0——APFS 异步记账，不作为回收时点契约）", "FsyncSpike（64KB write+force 每次 ~19–21ms）", "iostat -c 3 -w 1（KB/t tps MB/s + load average 1m/5m/15m 正常输出）"],
   "exit": 0,
   "note": "一次性 spike 目录 /tmp/u14-spike 于记录后定向删除；以上数值进入正文时标注为 macOS 单机观察值"
  }
 ],
 "honesty": {
  "notAContract": "线程创建上限（kern.num_taskthreads=4096）、EMFILE 阈值（nofile=80 → 76 次成功）、RSS/NMT/heapUsed、fsync 21–23ms、APFS 释放时点均为 macOS 26.7.1 单机观察值；Linux 对应语义（pids.max/RLIMIT_NPROC 按 getrlimit(2) 计线程、EMFILE 同语义、RSS/proc 记账、io.stat/io.max、cpu.weight/EEVDF、PSI）按内核文档与 man 手册推导并标注未实跑。fd 模式的 RLIMIT_NOFILE 只对子进程降低，不更改用户 shell/全局配置。",
  "unreproducedScenarios": "本机无 Docker：Linux 容器内 /proc/PID/cgroup、cgroup v1/v2 控制器实测（含 cpu.max 节流、memory.events oom_kill、io.stat/io.max、pids.max）、容器内 AvailableProcessors/MaxRAMPercentage 感知、OOMKilled 退出码 137、CAP_NET_BIND_SERVICE/非 root 低端口拒绝、非 root 读他人进程 /proc、SCHED_DEADLINE/实时调度、EEVDF 实际行为均未实跑，正文按 cgroup-v2 文档/capabilities(7)/getrlimit(2)/java(1) man/JDK-8146115 与 jdk-17.0.12+7 源码推导并逐项标注。macOS 可观测的对等物（task 线程上限、setrlimit、POSIX 权限、umask、信号与 hook、RSS/NMT）已实跑。",
  "distinguishing": "模型/推导层：cgroup 预算算例（budget 模式）、Linux pids/PSI/io 控制器行为、CAP_*、OOMKilled 137。真实组件层：Oracle JDK 17.0.12+8 于 macOS 的 JVM 行为（hook/dump/-Xrs/EMFILE/OOME/NMT）与 macOS 内核行为（RLIMIT、umask、低端口、task 线程上限、APFS 删除记账）。二者在正文与账本中分开标注。"
 }
}
