Unity IOS内存区间 内存管理

Physical Memory(物理内存):存放app包原始资源
Virtual Memory(虚拟内存):进程内存空间(包括代码段、动态库、GPU驱动内存、malloc堆内存和其他)
gpu driver memory(GPU驱动内存)
malloc heap(程序运行申请的堆内存)
paging(内存与磁盘空间交换的过程)
clean memory(只读内存页,可安全地放到磁盘或从磁盘重新加载)
dirty memory(非只读,无法像clean memory一样移动优化)
swapped commpressed memory(系统判定,较少使用,可放在一个压缩区域的内存)

Unity
Native Memory(C++申请)
Mono Heap(Net虚拟机,C#申请内存,GC管理,包含在Native Memory)

IOS内存管理
iOS是多任务操作系统,它允许多个应用程序在同一环境中共存。每个应用程序都有它自己的虚拟地址空间映射到物理内存的一些部分。

当物理内存不足的时候(或者是过多的应用程序被加载,或者是前台程序消耗了太多的物理内存),iOS开始尝试降低内存压力。

1. 首先,iOS尝试卸载部分Clean Memory页
2. 如果应用程序使用了过多的Dirty Memory,iOS会发送一个内存过低的预警给应用程序,让它自己释放一些内存。
3. 在若干次警告之后,如果应用程序依旧占用了过多的内存,iOS将会终止这个应用程序。

不幸的是,杀死进程的决定并不是透明的。但是它看上去就是由内存压力、内核内存管理器的内部状态以及操作系统已经尝试了多少次减少内存压力的操作决定的。只有当所有的储存空间使用完毕之后,它会决定杀死当前进程。这就是为什么有时候应用程序在申请了多于30%的内存的时候很快就退出了。

尝试调查闪退的最重要的部分就是Dirty Memory的控制,因为iOS无法主动移除脏页来提供更多空间给新的申请需求。这就意味着,修复内存释放问题,开发者必须做到以下几点:

1. 找出在游戏中有多少Dirty Memory,并且是否还随着时间增长。
2. 算出什么对象在贡献游戏的dirty memory 并且无法被压缩

参考:https://medium.com/chenjd-xyz/ios-memory-deep-dive-for-unity-developers-30f0e5d01cd8

posted on 2020-08-27 14:52  胖福  阅读(397)  评论(0编辑  收藏  举报

导航