Skip to content

Repository files navigation

Oiyo · Performance

内存压测

微信小程序(mp-weixin)开发态 Node 进程内存压测 说明与实测报告。

本仓库在标准 Oiyo + Wot UI starter 之上,附带 120 个压测页、生成脚本、内存监控脚本与原始采样数据,用于回答:

  1. 页面数量到 100+ 时,pnpm dev mp-weixin 会不会 OOM?
  2. 重模板(Wot UI + 大列表 + 假数据)对首次编译内存有多大影响?
  3. 编译就绪后批量改动文件(HMR / 差量编译)时,内存是否持续爬升?
  4. 负载上下限:稳态下限、压力起点、危险区、本机未 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 UIWdTagWdInputWdButtonWdCell / WdCellGroupWdIconWdProgress
  • 大模板: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 阶梯 · 2026-07-21)

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 或更高轮次才可能逼出

实用区间

  1. 安全下限(idle):≈ 1.3 GB tree RSS
  2. 可感知压力下限:≥ 1 页 HMR
  3. 危险上限(接近 heap 顶):≈ 3.0–3.2 GB(30–120 页 touch 峰值)
  4. 硬 OOM:当前 120 页 + 5s 分批(batch=10)下 未触发

5s 阶梯明细

负载(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 更能代表上限压力

5s 四轮场景

轮次 场景 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)。


历史结果总览(2s 采样 · 全量 120 页 HMR)

场景 峰值 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 稳态不回落

场景 A · 轻量页 · 仅编译与 watch

条件:120 个轻量页,不批量 touch。

阶段 tree RSS
启动 ~89 MB
编译中峰值 ~1136 MB
含 IDE 拉起峰值 1195 MB
watch 稳态 ~825–895 MB

要点:首次编译可完成;进入 watch 后内存回落并稳定,未见持续爬升。

场景 B / C · 重页面 · 全量 120 页批量 HMR×3

条件:重模板 120 页;ready 后对全部 index.vue 写入/更新 <!-- hmr-touch:... -->,强制 watcher 失效,触发差量编译;共 3 轮。

第 1 轮(场景 B)
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
第 2 轮(场景 C)
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

结论

  1. 仅堆页数(100+ 轻量页) 不足以让本机 dev mp-weixin 触发 Node OOM;watch 可稳定在约 1GB 以下(轻量)或 ~1.3 GB(重页无 HMR)。
  2. 重模板 + Wot UI + 假数据 抬高首次编译成本:ready 约 24–33s,boot 峰值约 1.5–1.6 GB
  3. 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)
  4. 负载上下限(本机 · 5s 阶梯)
    • 下限(idle):~1.25–1.58 GB
    • 压力起点:1 页 HMR
    • 危险区:10–30 页(2.4–3.1 GB)
    • 未 OOM 上限:~3.2 GB @ 120 页分批;全量多轮可逼近 4.0 GB

About

🏎 oiyo 框架的性能测试

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages