外观
Available Memory(设备可用页 · XNU memorystatus candidate)
当前单项验收(2026-10-17,限定E4 candidate):五新轮来源、异常偏离与连续性通过;每轮240新源/120完整槽/240普通参考点/0严重与来源违规。公式仍为不含secluded的近似,私有字段等价和完整精度未证,不等于生产分发门关闭。证据。
当前共享采集源(2026-10-07 G84):产品 SysmontapRawAdapter._make_stream 先用同一个 pymobiledevice3 原生 DeviceInfo 查询时钟与支持列,再用原生 Sysmontap 构造器建立完整14消费者固定依赖闭包(11进程列、3系统列);默认 intervalMs=500、ur=500 ms、sampleInterval=500000000 ns,保留CPU元数据与原生时钟。必需列缺失、非法类型或重复时明确失败,不以减少指标、补值或旧值续点降级。此为采集配置修复,不改变本页数值公式、scope、单位、质量/候选标签与独立误差门;完整54项与正式五轮仍待验,源码/安装验证不等于本指标数值校准。方案与验证。
作用域属性:[设备级 · 整机环境](Device Scope ) 当前状态:candidate-xnu-no-secluded(尚未完成字段探针与 PerfDog 同窗 E4 校准,不得描述为生产可用)
1. 定义与业务价值
Available Memory 的目标语义是 XNU 文档中 non-macOS memorystatus_available_pages 描述的"系统认为可以较快投入使用的页面"概念,比 Free Memory 更贴近"设备还能腾出多少内存"的直觉,但目前仍是候选重建,不是官方直接暴露的字段。
2. metricID / scope / unit / source
| 字段 | 值 |
|---|---|
| metricID | ios.device.memory.available |
| scope | device |
| unit | bytes |
| source | dvt.sysmontap |
| sourceKey | System.(vmFreeCount+vmExtPageCount+vmPurgeableCount)*VMPageSizeBytes |
| definitionVersion | memorystatus-available.approx-no-secluded.candidate.v1 |
| availability | experimental(Registry 中显式标注) |
取自当前 Registry。
3. iOS 系统原理
XNU 的 memorystatus_available_pages 语义(见 apple-oss-distributions/xnu VM 文档)描述系统在做内存压力决策时认为可以较快投入使用的页面构成,通常包括空闲页、可回收的外部/文件支持页、可清除(purgeable)页,以及某些系统上的 secluded 内存配额。sysmontap 的公开路径并不直接暴露这个官方聚合字段,Perfowl 只能用已知子字段做候选重建。
4. 系统服务 / 通信通道 / 采集命令与实现
通道:com.apple.instruments.server.services.sysmontap(DTX )。采集:pymobiledevice3 原生 Sysmontap(provider, process_attributes, system_attributes, interval_ms=intervalMs) 返回的 System 级快照;解析实现于 metric_engine.py::MetricEngine._system_metrics(第 315~326 行)。
5. 原始字段与字段语义
vmFreeCount:完全空闲页数;vmExtPageCount:外部(external/file-backed)可回收页数;vmPurgeableCount:可清除页数;secludedOverTarget:部分系统上的 secluded 内存配额——当前普通 sysmontap 路径尚未证明能够可靠取得该字段,第一阶段候选重建不包含它。
6. 精确公式
text
AvailablePagesCandidate = vmFreeCount + vmExtPageCount + vmPurgeableCount
(不含未验证的 secludedOverTarget)
AvailableMemoryBytes = AvailablePagesCandidate × VMPageSizeBytes
quality = "candidate-xnu-no-secluded" if 全部输入有效 else "missing-input"来源:metric_engine.py 第 315~326 行。四项必要字段(free/external/purgeable/pageSize)必须同时真实存在才计算,任一缺失则整体为 missing。
7. Clock / Window / Freshness
Gauge 类型,随同一 sysmontap 系统快照产出。
8. Baseline / Reset / Discontinuity
无 counter 语义,无前值依赖。
9. Quality:valid / candidate / missing
candidate-xnu-no-secluded(全部必要输入有效)或 missing-input(任一输入缺失)——绝不退化为 Free Memory 的数值,也不补 0。
10. 合法 0 的条件
理论上可以合法为 0(设备极端内存紧张场景),需结合其他证据交叉确认。
11. 当前证据、校准与平台覆盖
这是全 Memory 领域证据等级最低、门禁最明确的一项:字段语义验证与 PerfDog 同窗 E4 校准均尚未完成,definitionVersion 停留在 candidate.v1,availability 显式标注为 experimental。只有完成字段语义验证和 PerfDog 同窗 E4 后,才允许提升证据状态。
12. 如何分析:能得到什么结论,不能得到什么结论
能得到:在已知构成字段(free/external/purgeable)均有效时,对"系统认为可较快投入使用的页面"的候选估计,可用于观察整机内存环境的粗略趋势。
不能得到:
- 不能当作目标 App 的 Jetsam headroom 或 memory limit——它是设备级候选估计,不是任何进程的可用预算;
- 不能用 Free 替代 Available,也不能反过来——两者回答不同问题:Free 是"此刻完全空闲的页有多少",Available 是"在目标 memorystatus 语义下,系统认为可以较快投入使用的页有多少";
- 不得把当前候选值描述为与 PerfDog 或其他工具"已交叉验证"。
13. 常见误区
- 把 Available candidate 当作已完成校准的生产数值;
- 把 Available 当作目标 App 内存 headroom 的直接依据。
14. Legacy / 历史实现
历史版本的 Perfowl 曾把 vmFreeCount × pageSize(即今天的 Free Memory)错误命名为 Available Memory;memory-contract.v2 起两者正式分离,Available 才是对 XNU 官方语义的候选重建。历史 Session 中新版 availableMemoryBytes 字段在旧 memoryContractVersion 下按 missing-legacy-contract 处理,不与新语义拼接。
15. 版本历史与来源批次
本页由 site/knowledge/metrics/memory-metrics.md v5(2026-09-15)拆分而来,历史沿革见 Memory Contract 技术演进与实验。
| 版本 | 日期 | 修订要点 |
|---|---|---|
| v1(本页) | 2026-09-18 | 从 memory-metrics.md 拆出,成为 Available Memory 独立 Canonical;补充精确代码引用与四字段 fail-closed 规则。 |
2026-10-05 G24–G27来源复核(算法未改)
G26-R2原生Sysmon属性74 process/37 system(native set),真实System向量含free=2901/external=113304/purgeable=2371,候选118576pages;现有16KiB假设投影1942749184B。没有secluded或Available聚合属性。该投影只证同源算术,页大小和官方完整Available缺独立同窗参考;维持candidate-xnu-no-secluded,不改现有候选公式、不把缺项补0。 全54/独立误差/正式五轮100%仍待验收。完整方法、失败阶段与资源。
2026-10-05 G35 · 页大小独立观察(限定原设备A)
旧真机自有Fixture的181条host_page_size调用均返回status0/16384B,并与原封存清单和reference-manifest SHA一致;这关闭了该设备该次参考中16KiB常数是否有独立API观察这一窄项。产品的VMPageSizeBytes仍是adapter附入的候选约束标签,并未变为每次设备实测;其它设备/代际的页大小未证明。
181条self参考的Free与free+external+purgeable乘页大小算术自洽,不是产品Free/Available与独立内核值的动态同窗对照;secluded与完整Available定义仍缺参考。新默认关闭时钟参考仅E2准备,未回写旧Session或缩54项分母,不能把该窄观察当整项准确性/五轮100%通过。G35方法与证据边界。
| 版本 | 日期 | 修订 |
|---|---|---|
| 公式不变,参考观察增量 | 2026-10-05 | 设备A旧181条独立API页大小均16KiB;其它设备、动态数值与完整Available门不关闭。 |
采集源版本更新 · 2026-10-07
G84将SDK全列factory改为固定共享11+3列、输出与采样节拍一致;原生服务/DTX通道不变,支持列仍由SDK查询,传输及指标转换为Perfowl适配层,SDK来源和自研计算分开。初missing、counter warmup/reset、VM近似质量等原边界保留,不外推其他设备/场景持续100%。来源批次。
2026-10-17 来源新鲜度修复合同(尚未完成E4)
一次System源多次显示同一个可用内存值,并不证明采集连续。干净主线及安装179的纯软件输入复现:单一源之后10秒仍可重复读到旧scalar。本次将快照发表与事件公式分开治理;单项方案记录实际证据与边界,目前不增加已验收项。
新标记协议 sysmontapAvailableMemoryPublicationPolicy=device-available-source-once.v1:同一System行的free/external/purgeable均须非bool整数且0≤计数<2³²;页大小为有来源标签的整型16384候选。计算仍为三计数之和乘页,不改definitionVersion,不包含secluded。值的有效质量保持candidate-xnu-no-secluded;任一非法/缺失拒绝整体值,不补零或以Free替代。
新保管器分离primary/supplemental的schema、页、时钟与双序列,在同一source/epoch/reconnect内校验原生Start<End与严格新窗口,跨角色同End只发表一次。最多6条待发表、超过3个声明周期失效(500ms时1.5s);未来host receipt不提前使用,无新源明确missing。发表附原始三计数、页来源、角色、源序列/持久序列、设备窗口、代际与host年龄,host receipt新鲜不证明设备读点新鲜。进程身份不改变整机scope。
无新marker历史事件保留原重放;一旦新协议生效,坏marker/错schema/非法值不降回旧scalar。MetricEngine逐事件计算与realtime逐快照保管分别测试,缺失/重复/过期不得变成连续性成功。复用经验:先检验“每个显示点是否确有未消费新源”,再作参考数值对照,避免缓存让统计虚高。完整Available语义、secluded以及其它设备的页大小仍未校准。
| 版本 | 日期 | 变更与证据 |
|---|---|---|
| 来源一次发表v1计划,公式candidate.v1不变 | 2026-10-17 | E2复现旧scalar缓存/非整数输入;先文档再实现独立保管器,正式五轮与整包资格尚待完成。 |
五新轮候选异常偏离与连续性验收 · 2026-10-17(限定E4)
正式记录 · 方案与结果快照。内部b180/自有Lab MEM 20/40/80MiB,五轮固定15..135秒,各240/240新源、120/120完整槽、240/240普通参考点、0严重/来源违规,最大gap均0.5秒;先行诊断不计入分母,五新生命/Session及180秒冷却保留,异常轮不替补。当前范围可交内部测试,质量仍candidate-xnu-no-secluded,Registry实验性质不变;不把旧7未重验指标或伴随数据当新通过。
可复用方法:先把公式与“是否可再次显示”分开。逐事件派生帧只是原始源计算,不能用其条数冒充在线新源点;快照逐点绑定未消费的原生窗口/三计数、独立schema与双序列,TTL超过1.5秒必须missing,不缓存补线。CSV须逐行与实时包比值/空值/候选质量/整机scope/bytes,封存需同时核原件和副本、最终序列/报告与SQLite逻辑检查点,而不是只核汇总布尔值。
独立参考与限制:Lab host_statistics64组成H=(free+external+purgeable)host_page_size,C=H−speculativepage;sysmontap三字段与这些分量的精确等价未证,所以固定原生source窗±1秒参考包络[min(C),max(H)],而非单点近似挑选。需两侧括住、≤64参考、gap≤1.5秒,宽度>max(64MiB,(low+high)/4)不可评估;普通向外扩max(64MiB,15%),严重扩max(128MiB,30%)。缺测/参考不可比不算正常。这个门只判断明显偏离,不证明完整memorystatus、secluded或物理准确度;host receipt新鲜也不是device读点已证。
资源与兼容:10000完整处理匹配主线平均/P95从0.142467/0.273841ms到0.136922/0.230070ms;tracker保留5700B。压力P95 0.927156ms但最大62.380738ms,不能宣称每条≤1ms。legacy无新policy旧Session原样重放;marker生效后坏输入不可降回历史scalar。整GUI仍有安装与main既有网络/显示差异,b180为四组件内部增量包,公证暂缓/GPL门未关闭,不冒称对外正式分发。
| 版本 | 日期 | 变更与证据 |
|---|---|---|
| 来源一次发表v1限定验收,公式candidate.v1不变 | 2026-10-17 | 五新轮限定E4来源/包络异常/连续性及消费者;非完整私有语义/物理校准;源码2239、29独立控制、377适用归档方法、7消费者反例。 |