【问题标题】:Strange iOS memory allocation behavior奇怪的 iOS 内存分配行为
【发布时间】:2011-02-01 21:42:32
【问题描述】:

我在运行 iOS 4.2.1 的 iPhone 3G 上尝试分配大量内存时发现了一件很奇怪的事情。

当我在循环中调用 malloc(512 * 1024) 时,它会返回一个有效指针大约 1500 次,然后我得到一个 NULL

app(2032,0x3e7518b8) malloc: *** mmap(size=524288) failed (error code=12)
*** error: can't allocate region 

这让我很惊讶,因为我认为我的 iPhone 没有 750 MB 的 RAM。然后我在malloc 之后添加了memset,它使分配数量减少到120,这更有意义。

这是我使用的超级简单的代码:

for (int i = 1; ; ++i)
{
    void *p = malloc(512 * 1024);
    NSLog(@"%d %p", i, p);
    memset(p, 0, 512 * 1024);
}

虽然 iPhone 没有任何虚拟内存系统可以解释与此类似的行为。对此有何合理解释?

【问题讨论】:

    标签: iphone memory ios4


    【解决方案1】:

    在 iOS(和许多其他系统)上,对 malloc() 的调用实际上并不分配内存。它从操作系统/内核请求内存,但在写入内存之前不会满足请求(例如使用memset()。)这可以提高系统内存管理的效率,但可能会导致误导malloc()行为.

    【讨论】:

      【解决方案2】:

      iPhone 肯定有一个虚拟内存系统。它缺少的是将内存分页到磁盘的能力。换句话说,它缺少交换空间。

      【讨论】:

        猜你喜欢
        • 2014-02-15
        • 2012-07-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 2011-02-24
        相关资源
        最近更新 更多