活跃字节 vs 驻留大小

4
我正在对我的应用进行性能分析,想要查看应用在低内存情况下的行为。
我知道可以使用模拟器模拟低内存警告,但我不想模拟应用程序在触发内存警告时的行为,而是想看看应用在实际低内存环境下的行为。
为了逐渐增加内存使用量,我创建了一个调用 malloc(1024*1024) 的方法。
结果非常有趣。我可能理解有误,需要帮助。
在 Instruments Allocations 中,有一段时间应用程序在“Live Bytes”列上使用超过1GB,但在真实设备上运行时应用程序没有崩溃并且正常工作。

live bytes screenshot

查看 VM Tracker 中的 Resident/Dirty 大小,我得到了不同的结果,Resident 大约为 134MB,Dirty 大约为 78MB。

resident size screenshot

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

实时字节数:已分配但未释放的字节数。

常驻大小:实际使用的内存量。

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

1个回答

1

这里有点棘手。我进行了一些测试。以下是一些评论:

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的空间并且没有释放,但在instruments中显示正确,但它并没有有效地导致内存崩溃,因为这1GB的空间中没有存储任何内容。看起来编译器可能正在进行一些优化,并忽略这1GB,因此没有内存崩溃。
如果您将代码更改为:
  for (int i=0; i<1000; ++i)
{
    char* a =  (char*) malloc(1024*1024);
    memset(a, 'b', 1024*1024);
}

在这里,你只是将字符'b'分配给1GB空间中的每个字节。这将导致内存崩溃。因此,我的结论是编译器对空的malloc进行了优化。

希望这可以帮助你。


我有一个按钮调用了我的方法,它不是一个循环。忘了提到。我得出了同样的结论,问题在于我没有找到任何文档。但似乎它确实优化了空的mallocs。谢谢。 - iDevzilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接