#define GB (1ULL * 1024 * 1024 * 1024)/* * This test expects the entitlement to be the enabling factor for a process to * allocate at least this many GB of VA space. i.e. with the entitlement, n GB * must be allocatable; whereas without it, it must be less. * This value was determined experimentally to fit on applicable devices and to * be clearly distinguishable from the default VA limit. */#define ALLOC_TEST_GB 53T_DECL(TESTNAME,"Verify that a required entitlement is present in order to be granted an extra-large ""VA space on arm64",T_META_NAMESPACE("xnu.vm"),T_META_CHECK_LEAKS(false)){int i;void*res;if (!dt_64_bit_kernel()) {T_SKIP("This test is only applicable to arm64");}T_LOG("Attemping to allocate VA space in 1 GB chunks.");for (i = 0; i < (ALLOC_TEST_GB * 2); i++) {res = mmap(NULL, 1 * GB, PROT_NONE, MAP_PRIVATE | MAP_ANON, 0, 0);if (res == MAP_FAILED) {if (errno != ENOMEM) {T_WITH_ERRNO;T_LOG("mmap failed: stopped at %d of %d GB allocated", i, ALLOC_TEST_GB);}break;} else {T_LOG("%d: %pn", i, res);}}#if defined(ENTITLED)T_EXPECT_GE_INT(i, ALLOC_TEST_GB, "Allocate at least %d GB of VA space", ALLOC_TEST_GB);#elseT_EXPECT_LT_INT(i, ALLOC_TEST_GB, "Not permitted to allocate %d GB of VA space", ALLOC_TEST_GB);#endif}
可见 , 当开启com.apple.developer.kernel.extended-virtual-addressing时 , 内核的可分配空间确实有明显提升 。
上线效果与结论从QQ浏览器的上线效果来看 , JS相关的内存分配Crash在14.0以上系统几乎全部消失 。上线第一天App崩溃率环比下降接近50% , 效果显著 。
文章插图
简单总结:
- 苹果很少在公开文档中说明64位App在虚拟内存使用上存在限制 。而且很多App也并没有像浏览器内一样 , 为业务灵活性而选择将hippy、flutter等技术进行大规模的组合使用 , 所以可能很多App其实并不会遇到虚拟内存不足的情况 。
- 上线效果也说明浏览器在混合开发的场景下 , 内存优化仍然存在很大的空间 。因为Extended Virtual Addressing仅能缓解虚拟内存不足的情况 , 并不意味着App的物理内存也得到增加 , 对FOOM的治理仍然需要持续 。
- 鉴于司内有不少的著名组件都会使用mmap机制进行内存管理 , 建议在使用相关组件时 , 控制好mmap的大小 。
- 如果有需要在iPhone 12 Pro、M1 iPad、M1上运行应用 , 并希望解放更多的物理内存 , 建议增加com.apple.developer.kernel.increased-memory-limit的能力声明 , 实测在iPhone 13 Pro下可以增加1GB的可用物理内存 。
- ReactNative和类似框架在项目中使用较多的 , 建议需要考虑多个Context的复用 , 减少创建重复内容 , 司内外都有实践证明该措施十分有效 。
- 对于flutter一类的内存优化 , 可翻阅engine的相关代码 。flutter vm在创建时允许外部传参控制vm行为 , 包括:old heap size、leak vm等 。合适的参数可比较有效控制内存占用 。
推荐阅读
- 苹果这一限制终于解除,iOS 更开放
- 能让 iOS 保持流畅的墓碑机制,安卓也有了
- 苹果|苹果发布iOS/iPad OS 15.6准正式版:修复Bug 流畅度/性能继续提升
- 苹果13.6.1系统怎么样?
- 什么叫生物圈?
- 《dnf》一键拾取怎么设置?
- 快手怎么一键取消关注?
- ios14画中画适配app了吗?
- 卸载手机应用,很多人第一步就错了,教你正确方法,释放大量内存
- 苹果路由器来了,搭载 iOS 系统