如何增加 iOS APP 虚拟地址空间及内存上限?XNU 内核源码解读

简介: 1. 引言最近一段时间在做钉钉 iOS 内存专项治理,解决内存不足时的 jetsam 事件及 malloc 的异常崩溃。在进程创建时系统会为每个 app 设定内存最大使用上限,内核会维护一个内存阈值优先级列表,当设备内存不足时低优先级的 app 会首先被内核中止进程。在阅读 XNU 内核源码过程中我们发现提供系统了两种能力可以扩展 App 的虚拟地址空间(com.apple.developer.kernel.extended-virtual-addressing)和增加内存使用上限(com.apple.developer.kernel.increased-memory-limit)。

每个 App 进程都有自己的虚拟地址空间,在 32 位系统时,虚拟地址空间为 4G,按一般理解 64 位系统虚拟内存地址不受限制的,但通过阅读 XNU 代码发现虚拟地址空间和设备有关联,不同的设备虚拟地址空间是不一样的。当 App 开启"com.apple.developer.kernel.extended-virtual-addressing"这个 entitlement 能力后,内核会增加 App 的虚拟地址空间,使用这个能力 App 可以获得更大的地址空间,解决业务需要申请大的虚拟地址分配导致的崩溃异常。苹果官方解释如下:

“A Boolean value that indicates whether the app may access an extended address space.


Use this entitlement if your app has specific needs that require a larger addressable space. For example, games that memory map assets to stream to the GPU may benefit from a larger address space”

2.1 方案

如何开启这个能力呢?需要在 App entitlement 文件里增加 “com.apple.developer.kernel.extended-virtual-addressing” 的配置,设置 value 的值为 True,同时需要更新证书。

2.2 数据验证

我们通过测试代码来验证下开启 “com.apple.developer.kernel.extended-virtual-addressing” 和未开启时的数据对比。由于是增加虚拟内存地址空间,我们尝试无限分配大内存但不 Dirty 数据试试,每次循环分配 1M 内存,直到无法分配内存地址,最后统计分配的内存数据大小。部分代码如下

image.png

从测试数据上惊奇发现未开启地址空间是 2G,开启后达到 54G,开启后内核会为 App 扩展足够使用的虚拟地址空间。

2.3 内核源码分析

通过分析 XNU 内核源码,我们发现如果开启 “com.apple.developer.kernel.extended-virtual-addressing” 能力后,内核会开启一种称之为 “jumbo” 模式。未开启 “jumbo” 模式时不同的设备虚拟地址空间是不一样的,虚拟地址空间和设备有关联,当开启后在 iOS14 以上设备虚拟地址空间会达到 64G。整体数据如下列表:

image.png

2.3.2 jumbo 模式申请地址空间

64 位通过 pmap_max_64bit_offset 这个接口来申请虚拟地址空间,如果开启“jumbo”模式,这个接口参数 option 的值是 ARM_PMAP_MAX_OFFSET_JUMBO,如果未开启 option 的值是 ARM_PMAP_MAX_OFFSET_DEVICE,通过代码发现 ARM_PMAP_MAX_OFFSET_DEVICE 选项在不同的设备的空间是不一样的。部分核心代码如下:

image.png在进程创建时,系统会为 App 指定默认的内存上限,在 App 运行过程中分配的内存超过内核指定的内存上限时,内核会触发 jetsam 机制主动中止当前进程。在研究 XNU 内核代码过程中,发现系统提供了三种方式来增加 App 的内存使用上限。如果 App 申请了“com.apple.developer.kernel.increased-memory-limit” entitlement 配置能力后,内核会增加 App 的内存上限。当 App 分配的内存超过系统默认的内存上限后,App 仍然可以继续很好的运行。相对于未申请该能力的其他进程,拥有该能力的 App 有了更高内存使用优先级。苹果官网解释如下:

“A Boolean value that indicates whether core features of your app may perform better with a higher memory limit on supported devices.


Add this entitlement to your app to inform the system that some of your app’s core features may perform better by exceeding the default app memory limit on supported devices. If you use this entitlement, make sure your app still behaves correctly if additional memory isn’t available”。

3.1 方案

苹果提供了如下三种方式来主动增加 App 的内存上限。主动申请增加内存上限需要在 entitlement 里增加配置能力,三种方案各有不同的策略,而且有些方案是内核私有能力。三种方案对比如下:

image.png

通过测试发现,开启增加内存上限 entitlement 后,相比未开启内存分配的数据会略微增加。

3.3 内核源码分析

3.3.1 内存告警计算

进程 task 初始化时会解析启动的入参“max_task_pmem”,读取 app 最大的内存限制。App 内存最大限制及告警阈值和设备内存的大小有关联,当 App 使用内存超过最大内存限制的 80%时会发出 warning 初步告警。计算列表如下:

image.png

3.3.2 能力开启

App 进程创建时通过判断 Entitlement 是否开启 “com.apple.developer.kernel.increased-memory-limit” 配置能力,如果开启后通过 “memorystatus_act_on_entitled_task_limit” 方法来增加内存上限。核心代码如下:

image.png

4. 总结

通过内核探索我们初步了解了系统在虚拟地址空间和内存分配上限的运行逻辑,申请两种能力后 App 可以申请更多的虚拟地址空间和内存上限。开启 “jumbo” 模式 可以解决一些大地址内存映射地址空间不足导致的异常及崩溃等问题,申请增加内存上限后 App 可以获得更多的内存分配优先权,App 运行会更加流畅。

5. 参考



相关文章
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
710 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
运维 iOS开发 Windows
windows电脑备案ios APP获取公钥和证书指纹Sha-1值的方法
在阿里云进行APP备案、在备案IOS端的环节的时候,发现需要我们将p12证书安装在电脑上,再用xcode或或钥匙串访问来获取这个证书的公钥和sha-1值。 但是大部分开发uniapp应用的同学们,或者进行发布的运维人员的电脑都是windows,无法按照阿里云的教程来获取ios的公钥和sha-1。备案就被卡主了。 这里介绍下另一个方法,就是使用香蕉云编来在线上传证书获取。如下图所示,打开香蕉云编后,找到下图这个功能
1500 0
|
存储 Java PHP
轻量化短视频电商直播带货APP源码全解析:核心功能与设计流程​
在电商直播热潮下,开发专属直播带货APP成为抢占市场关键。本文详解原生开发轻量化APP的核心功能与全流程设计,涵盖用户登录、商品浏览、直播互动、购物车、订单及售后功能,并介绍安卓端Java、苹果端Object-C、后台PHP的技术实现,助力打造高效优质的直播电商平台。
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
人工智能 IDE 前端开发
写给尊贵的 Tare Pro 用户的喂饭级 IOS APP 开发指南
本文介绍了如何利用 AI IDE Trae,从零开始快速开发一个 iOS 应用《回声》。通过 AI 辅助完成需求梳理、原型设计、编码与调试,展示了 AI 在整个开发流程中的强大助力。
2813 0
|
消息中间件 缓存 小程序
婚恋交友相亲公众号app小程序系统源码「脱单神器」婚恋平台全套代码 - 支持快速二次开发
这是一套基于SpringBoot + Vue3开发的婚恋交友系统,支持微信公众号、Uniapp小程序和APP端。系统包含实名认证、智能匹配、视频相亲、会员体系等功能,适用于婚恋社交平台和相亲交友应用。后端采用SpringBoot 3.x与MyBatis-Plus,前端使用Vue3与Uniapp,支持快速部署和二次开发。适合技术团队或有经验的个人创业者使用。
1080 8
|
Swift iOS开发 开发者
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
3483 13
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
|
存储 数据安全/隐私保护 开发者
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
1135 8
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
|
小程序 Java 关系型数据库
圈子系统公众号app小程序系统源码圈子系统带即时通讯 多级圈子系统源码 兴趣小组系统开源 私密圈子系统代码 会员制社区系统
本圈子系统解决方案提供即时通讯、多级圈子、兴趣小组、私密社区及会员制管理功能。支持开源与商业方案,推荐ThinkSNS+、EasyClub及OpenFire等系统,并提供前后端技术选型建议,助力快速搭建社交平台。
696 0
不封号的外卖抢单神器,美团抢单辅助器app,autojs版本源码
这个代码提供了基础框架,包含主循环、订单检测和点击功能。实际使用时需要根据美团骑手AP