一键释放iOS 64位App潜力( 四 )


#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% , 效果显著 。

一键释放iOS 64位App潜力

文章插图
 
简单总结:
  1. 苹果很少在公开文档中说明64位App在虚拟内存使用上存在限制 。而且很多App也并没有像浏览器内一样 , 为业务灵活性而选择将hippy、flutter等技术进行大规模的组合使用 , 所以可能很多App其实并不会遇到虚拟内存不足的情况 。
  2. 上线效果也说明浏览器在混合开发的场景下 , 内存优化仍然存在很大的空间 。因为Extended Virtual Addressing仅能缓解虚拟内存不足的情况 , 并不意味着App的物理内存也得到增加 , 对FOOM的治理仍然需要持续 。
  3. 鉴于司内有不少的著名组件都会使用mmap机制进行内存管理 , 建议在使用相关组件时 , 控制好mmap的大小 。
  4. 如果有需要在iPhone 12 Pro、M1 iPad、M1上运行应用 , 并希望解放更多的物理内存 , 建议增加com.apple.developer.kernel.increased-memory-limit的能力声明 , 实测在iPhone 13 Pro下可以增加1GB的可用物理内存 。
  5. ReactNative和类似框架在项目中使用较多的 , 建议需要考虑多个Context的复用 , 减少创建重复内容 , 司内外都有实践证明该措施十分有效 。
  6. 对于flutter一类的内存优化 , 可翻阅engine的相关代码 。flutter vm在创建时允许外部传参控制vm行为 , 包括:old heap size、leak vm等 。合适的参数可比较有效控制内存占用 。
以上源码相关的内容仅个人阅读理解 , 如有错误请指出 。




推荐阅读