直播字节与居民大小

时间:2014-01-17 16:05:42

标签: ios memory memory-management instruments

我正在分析我的应用,并试图了解应用在低内存情况下的行为。

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

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

的方法

char * a = malloc(1024 * 1024);

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

在乐器分配上,在某些时候,我的应用程序在“实时字节”列上使用了超过1GB的内容,但该应用程序没有在真实设备上运行并且工作正常。

live bytes screenshot

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

resident size screenshot

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

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

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

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

1 个答案:

答案 0 :(得分:0)

这里有点棘手。我做了一些测试。几条评论:

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空间中的每个字节。这将导致内存崩溃。所以我的结论是编译器优化了空的malloc。

希望这有帮助