微信小程序(mp-weixin)开发态 Node 进程内存压测 说明与实测报告。
本仓库在标准 Oiyo + Wot UI starter 之上,附带 120 个压测页、生成脚本、内存监控脚本与原始采样数据,用于回答:
- 页面数量到 100+ 时,
pnpm dev mp-weixin会不会 OOM? - 重模板(Wot UI + 大列表 + 假数据)对首次编译内存有多大影响?
- 编译就绪后批量改动文件(HMR / 差量编译)时,内存是否持续爬升?
- 负载上下限:稳态下限、压力起点、危险区、本机未 OOM 上限分别是多少?
| 监控 | 不监控 |
|---|---|
| Node / Vite / Oiyo 编译进程树 RSS(Working Set) | 微信开发者工具自身内存 |
| 首轮编译与 watch 稳态 | 真机 / 模拟器小程序运行时 JS 堆 |
| 批量 touch 触发的差量编译 | 页面 FPS、包体积、冷启动耗时 |
| 路径 | 作用 |
|---|---|
src/packages/oom-stress/page-001 ~ page-120 |
120 个分包压测页 |
scripts/generate-oom-stress-pages.mjs |
批量生成 / 覆盖压测页 |
scripts/monitor-mp-weixin-memory.mjs |
启动 dev、采样进程树 RSS、阶梯/分批 HMR touch、写报告 |
scripts/oom-reports/ |
历次 JSON / CSV / Markdown 原始报告 |
- Wot UI:
WdTag、WdInput、WdButton、WdCell/WdCellGroup、WdIcon、WdProgress - 大模板:6 分区 × 每区 24 行列表 + 详情卡片(标签、按钮组、指标条、进度条)
- 假数据:订单 / 用户 / 标签 / 长描述 / metrics 数组等合成数据
| 项 | 值 |
|---|---|
| OS | Windows |
| Node | v22.21.1 |
| 命令 | pnpm exec oiyo dev mp-weixin |
| Heap 上限 | NODE_OPTIONS=--max-old-space-size=4096 |
| 压测页数 | 120(packages/oom-stress) |
| 采样间隔 | 5s(早期报告约 2s;过密时阶段叠在一起难观察) |
| touch 操作间隔 | 5s(batch 之间;--touch-interval) |
| 分批 touch | 默认 batch-size=10 |
OOM 判定关键字:JavaScript heap out of memory / FATAL ERROR / Allocation failed。
下列实测均未命中(oomDetected: false)。监控脚本结束后用 taskkill 收进程,Windows 上可能出现 exitCode=1,不代表压测失败。
在 5s 采样 + 5s touch 下做多轮阶梯,结论如下。
| 边界 | 数值 | 含义 |
|---|---|---|
| 下限(稳态) | ~1.25–1.58 GB | 冷启动后 watch 稳定占用;无 HMR 约 1.26 GB |
| 压力起点 | ≥ 1 页 HMR | 任意 1 个 heavy 页 touch 即可明显抬升(约 +0.5–0.6 GB) |
| 危险区 | 10–30 页 | peak 进入 2.4–3.1 GB |
| 本机未 OOM 上限 | ~3.2 GB @ 120 页 | 分批 touch 下 peak 3225 MB,仍无 FATAL OOM |
| 硬 OOM 边界 | 未打穿 | 需更大 batch、更密 touch 或更高轮次才可能逼出 |
实用区间:
- 安全下限(idle):≈ 1.3 GB tree RSS
- 可感知压力下限:≥ 1 页 HMR
- 危险上限(接近 heap 顶):≈ 3.0–3.2 GB(30–120 页 touch 峰值)
- 硬 OOM:当前 120 页 + 5s 分批(batch=10)下 未触发
| 负载(touch 页数) | start → end (MB) | peak (MB) | ΔRSS (MB) | 判定 |
|---|---|---|---|---|
| 0(idle watch) | ~1581 → 1257 | 1581 | 稳定 | 下限基线 |
| 1 | 1250 → 1858 | 1859 | +608 | pressure |
| 2 | 1858 → 2547 | 2547 | +689 | pressure |
| 10 | 1258 → 2432 | 2432 | +1174 | pressure |
| 30 | 2432 → 2995 | 3070 | +563 | pressure |
| 60 | 1254 → 1809 | 3008 | +555 | pressure |
| 90 | 1809 → 1888 | 2977 | +79 | elevated |
| 120 | 1888 → 2014 | 3225 | +127 | pressure |
注:
start/end为该阶梯开始/结束时的采样值;peak为该阶梯过程中最高 tree RSS。settle 后常见回落 1GB+(编译缓存释放),因此 峰值比 end 更能代表上限压力。
| 轮次 | 场景 | Peak RSS | OOM | 报告标签 |
|---|---|---|---|---|
| r3 | 基线 · 无 HMR · 120s watch | 1580.9 MB | 无 | baseline-5s-r3 |
| r2 | 低负载 ladder 1,2 |
2547.2 MB | 无 | ladder-5s-r2-low |
| r1 | 中负载 ladder 10,30 |
3069.9 MB | 无 | ladder-5s-r1 |
| r4 | 高负载 ladder 60,90,120 |
3225.2 MB | 无 | ladder-5s-r4-high |
对应文件:scripts/oom-reports/mp-weixin-memory-*-2026-07-21T*.{md,json,csv}。
5s vs 2s:2s 操作过密时 touch → 差量编译 → 爬升 → settle 叠在一起;5s 后可清晰看到各阶段(例如 60 页:1254 → 分批爬到 ~3008 → settle 回落到 ~1809)。
| 场景 | 峰值 tree RSS | 首轮 ready | OOM 文案 | 结论 |
|---|---|---|---|---|
| A 轻量 120 页 · 仅 dev | 1195 MB | ~20.7s | 无 | 页数本身打不爆 Node |
| B 重页 120 页 · HMR×3(第 1 轮) | 3640 MB | ~32.6s | 无 | 批量 HMR 显著抬升内存 |
| C 重页 120 页 · HMR×3(第 2 轮) | 4026 MB | ~27.8s | 无 | 峰值贴近 4GB 上限;post 稳态不回落 |
条件:120 个轻量页,不批量 touch。
| 阶段 | tree RSS |
|---|---|
| 启动 | ~89 MB |
| 编译中峰值 | ~1136 MB |
| 含 IDE 拉起峰值 | 1195 MB |
| watch 稳态 | ~825–895 MB |
要点:首次编译可完成;进入 watch 后内存回落并稳定,未见持续爬升。
条件:重模板 120 页;ready 后对全部 index.vue 写入/更新 <!-- hmr-touch:... -->,强制 watcher 失效,触发差量编译;共 3 轮。
| phase | start → end (MB) | max (MB) | delta (MB) |
|---|---|---|---|
| boot | 89 → 1636 | 1636 | +1547 |
| pre-hmr-steady | 1636 → 1244 | 1636 | -392 |
| HMR round 1 | 1344 → 2385 | 2385 | +1041 |
| HMR round 2 | 2468 → 3176 | 3176 | +708 |
| HMR round 3 | 3266 → 3640 | 3640 | +374 |
| post-hmr-steady | 3640 → 3329 | 3640 | -311 |
| phase | start → end (MB) | max (MB) | delta (MB) |
|---|---|---|---|
| boot | 89 → 1590 | 1590 | +1501 |
| pre-hmr-steady | 1590 → 1234 | 1591 | -356 |
| HMR round 1 | 1339 → 2749 | 2749 | +1410 |
| HMR round 2 | 2962 → 3409 | 3409 | +447 |
| HMR round 3 | 3391 → 3847 | 4026 | +456 |
| post-hmr-steady | 3847 → 3847 | 3847 | 0 |
- 仅堆页数(100+ 轻量页) 不足以让本机
dev mp-weixin触发 Node OOM;watch 可稳定在约 1GB 以下(轻量)或 ~1.3 GB(重页无 HMR)。 - 重模板 + Wot UI + 假数据 抬高首次编译成本:ready 约 24–33s,boot 峰值约 1.5–1.6 GB。
- HMR / 差量编译是主要内存放大器:
- 1 页 touch 即可 +0.5–0.6 GB(压力起点)
- 10 页 常见 +1.1 GB 量级
- 30–120 页 分批 touch 峰值 ~3.0–3.2 GB
- 全量 120 页 × 多轮 峰值可达 3.6–4.0 GB(贴近 4GB heap)
- 负载上下限(本机 · 5s 阶梯):
- 下限(idle):~1.25–1.58 GB
- 压力起点:1 页 HMR
- 危险区:10–30 页(2.4–3.1 GB)
- 未 OOM 上限:~3.2 GB @ 120 页分批;全量多轮可逼近 4.0 GB