当前位置: 游戏平台 > 互联网科技 > 正文

内部存储器管理

时间:2020-04-21 07:36来源:互联网科技
随着用户的增长,用户使用时间的延长,APP的内存问题会变得越发严重。今年WWDC大会,有个专门的session,深入解析iOS内存。 内存分类 A dirty page is something that contains process specificinform

随着用户的增长,用户使用时间的延长,APP的内存问题会变得越发严重。今年WWDC大会,有个专门的session,深入解析iOS内存。

图片 1

内存分类

  1. A dirty page is something that contains process specific information
  2. clean page is something that the kernel could regenerate later if needed such as rereading from disc.(在闪存中备份,能够再次读取
    So dirty pages are much more expensive than clean pages.
  • Clean Memory: 在闪存中有备份,能够再次读取。主要包括system framework、binary executable of your app、memory mapped files
  • Dirty Memory:所有非Clean Memory,系统无法回收。包括Heap allocation、caches、decompressed images

我是写了iOS内存分析上-图片加载内存分析后看到了这个session,发现大致的思路相同,都是从实用角度分析怎么减少内存消耗、footprint测量、图片内存占用分析几个角度。session中的讲解更加详尽一些,本文尝试整理session内容,并会增加一些自己的理解。

这个topic主要介绍了如何分析iOS app的内存占用和如何做内存优化,包括以下几部分,

terminology

  1. 段式虚拟内存
  2. 页式虚拟内存

Clean Memory: 在闪存有备份,能再次读取重建
Code, framework, memory-mapped files
Dirty memory: 系统无法回收
Heap allocations,decompressed images, caches

  • 降低内存峰值
  1. Lazy Allocation
  2. alloca(size_t)
    栈分配仅仅修改栈指针寄存器,比如malloc遍历并修改空闲列表要快的多
    仅仅适合于小
    3.calloc
    理解分配虚拟内存并设置清0标志位,但不分配物理内存
    4.NSAutoReleasePool
    基于引用计数,pool执行drain方法会release所有au
  • Objective-C将堆内存管理抽象出来了,不需要用malloc和free来分配或者释放对象所占内存。OC运行期环境把这部分工作抽象为一套内存管理架构,名叫引用计数

1 为什么要减少内存消耗?

APP加载更快,系统更流畅,APP的内存驻留时间更长,其他APP的内存驻留时间更长……总之,一句话:

为了更好的用户体验

  • 什么是内存占用
  • 怎么分析内存占用
  • 内存杀手---图像

引用计数

  • CFRunTime.c __CFDoExternRefOperation
CF_EXPORT uintptr_t __CFDoExternRefOperation(uintptr_t op, id obj) {
    if (nil == obj) HALT;
    uintptr_t idx = EXTERN_TABLE_IDX(obj);
    uintptr_t disguised = DISGUISE(obj);
    CFLock_t *lock = &__NSRetainCounters[idx].lock;
    CFBasicHashRef table = __NSRetainCounters[idx].table; //取得对象对应的散列表
    uintptr_t count;
    switch (op) {
    case 300:   // increment
    case 350:   // increment, no event
        __CFLock(lock);
    CFBasicHashAddValue(table, disguised, disguised);
        __CFUnlock(lock);
        if (__CFOASafe && op != 350) __CFRecordAllocationEvent(__kCFObjectRetainedEvent, obj, 0, 0, NULL);
        return (uintptr_t)obj;
    case 400:   // decrement
        if (__CFOASafe) __CFRecordAllocationEvent(__kCFObjectReleasedEvent, obj, 0, 0, NULL);
    case 450:   // decrement, no event
        __CFLock(lock);
        count = (uintptr_t)CFBasicHashRemoveValue(table, disguised);
        __CFUnlock(lock);
        return 0 == count;
    case 500:
        __CFLock(lock);
        count = (uintptr_t)CFBasicHashGetCountOfKey(table, disguised);
        __CFUnlock(lock);
        return count;
    }
    return 0;
}

可以从__CFDoExternRefOperation 函数以及由此函数调用的各个函数名看出,苹果大概就是采用散列表(引用技术表)来管理引用计数

图片 2

通过散列表管理引用计数

2.减小哪一部分的内存消耗?

不是所有的内存都是同等的,我们在iOS开发中,需要关注的内存消耗是:

Memory Footprint

Not all memory is created equal.**Memory page** --- 内存管理中最小的单位。它是系统分配的,有可能一个page持有多个对象,也可能有些大的对象可以跨越多个pages。

参考链接

iOS内存管理及优化
先弄清楚这里的学问,再来谈 iOS 内存管理与优化(一)

编辑:互联网科技 本文来源:内部存储器管理

关键词: