【问题标题】:Live Bytes vs Resident Size实时字节与驻留大小
【发布时间】:2014-02-07 01:14:07
【问题描述】:

我正在分析我的应用,并试图查看应用在内存不足的情况下会如何表现。

我知道我可以使用模拟器模拟内存不足警告,但我不想模拟触发内存警告时应用程序的行为方式,而是查看应用程序在实际内存不足时的行为方式内存环境。

为了增加内存使用超时,我创建了一个调用方法

char *a = malloc(1024*1024);

结果相当有趣。 我可能读错了,这就是我需要帮助的地方。

在仪器分配上,有时我在“Live Bytes”列上使用了超过 1GB 的应用程序,但该应用程序在真实设备上运行并没有崩溃并且运行良好。

查看 Resident/Dirty 大小,在 VM Tracker 上,我得到了不同的结果,大约 134mb 的 resident 和 78mb 的脏大小。

我在这里缺少什么? 根据文档:

Live Bytes : 已分配但未释放的字节数。

Resident Size: 实际使用的内存量。

为什么结果如此不同? 谢谢

【问题讨论】:

    标签: ios memory memory-management instruments


    【解决方案1】:

    这里有点棘手。我进行了一些测试。几个cmets:

    1- 您应该始终对分配的内存进行类型转换:

    char *a = (char*) malloc(1024*1024);
    

    2- 如果您在上面分配 1MB 并且我在活动字节中看到 1GB,这告诉我您正在使用这样的 for 循环(1000 次):

    for (int i=0; i<1000; ++i)
    {
       char* a =  malloc(1024*1024);
    }
    

    看起来即使您分配了 1GB 的空间并没有释放它;它在仪器中正确显示 - 但它没有有效地导致内存崩溃,因为这 1GB 空间中没有存储任何内容。看起来编译器可能正在做一些优化并忽略这 1GB,因此没有内存崩溃。

    3- 如果您将代码更改为:

      for (int i=0; i<1000; ++i)
    {
        char* a =  (char*) malloc(1024*1024);
        memset(a, 'b', 1024*1024);
    }
    

    在这里,您只是将字符“b”分配给 1GB 空间中的每个字节。这将导致内存崩溃。所以我的结论是编译器优化了空mallocs。

    希望对你有帮助

    【讨论】:

    • 我有一个调用我的方法的按钮,它不是一个循环。忘了提。我得出了同样的结论,问题是我没有找到任何文件。但似乎它确实优化了空mallocs。谢谢。
    猜你喜欢
    • 2013-09-08
    • 2011-03-03
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多