uni-app 无法获取内存占用是因 JS 层未桥接原生内存接口;Android 需自定义插件调用 ActivityManager,iOS 仅 plus.memory.getAvailableMemory() 可用且仅返回进程可用内存上限。

uni-app 无法直接获取 App 当前内存占用(如已用 RAM、进程 RSS),这是跨端运行时的硬性限制,不是配置或调用方式的问题。
为什么 uni.getSystemInfo() 和 plus.runtime.getInfo() 都拿不到内存数据
uni-app 的 JS 运行环境不暴露原生内存接口:Android 的 ActivityManager.MemoryInfo、iOS 的 task_info 均未桥接到 JS 层。调用 uni.getSystemInfoSync() 返回的对象里没有 memoryUsage 字段;plus.runtime.getInfo() 只返回版本、渠道等静态信息,调用后也查不到内存相关 key。常见错误现象是搜到所谓 uni.getMemoryInfo() 或 plus.app.getMemory(),实际执行报错 undefined is not a function。
Android 端可临时监控:需自定义原生插件 + 本地调试基座
仅限 Android 真机、必须使用 HBuilderX 本地制作「自定义调试基座」,云打包无效。核心是绕过 JS 层限制,用 Java 直接读取系统内存状态:
- 在
nativeplugins/android/src/main/java/下新建MemoryPlugin.java,调用ActivityManager.getMemoryInfo()获取availMem和totalMem - JS 层通过
uni.requireNativePlugin('memory')调用,返回形如{ used: 124567890, total: 3890123456 }的对象 - 注意:
used = total - avail是粗略估算值,非精确进程 RSS;iOS 完全不可行(无 entitlements 权限,App Store 拒绝上架)
iOS 唯一可用接口:plus.memory.getAvailableMemory()
这是 iOS 上唯一 App Store 兼容的内存相关 API,但它的含义和用途常被误解:
- 它返回的是当前进程「还能申请的最大内存上限」,不是整机空闲 RAM,数值通常比系统设置里显示的小很多
- 必须包裹在
#ifdef APP-PLUS && #ifdef IOS中,H5 和小程序环境无效 - 返回对象含
available(字节)和total(字节),但total在 iOS 上常为 0 或不可信,只建议用available做阈值判断(例如 - 不要试图用它推算“已用内存”,那会得出完全错误的结论
更务实的替代方案:用跨端可测指标代替内存数字
与其执着于不可靠的内存数值,不如关注对用户体验有直接影响、且 uni-app 原生支持的信号:
- 用
performance.now()结合页面onLoad/onReady时间戳,计算首屏渲染耗时(比内存更能反映卡顿) - 监听
uni.onMemoryWarning—— 这是系统发出的真实内存压力信号,Android/iOS 均支持,触发时应立即释放缓存、暂停非关键任务 - 用
uni.getSystemInfoSync().SDKVersion和.platform区分低端机型(如 Android 5.x、iOS 10),提前做资源降级(关闭动画、压缩图片尺寸)
真正容易被忽略的点是:内存占用本身不是问题,OOM 前的不可控崩溃才是。而 onMemoryWarning 是你唯一能稳定捕获的、离 OOM 最近的可操作窗口。


















