我正在分析我的应用,并试图了解应用在低内存情况下的行为。
我知道我可以使用模拟器模拟低内存警告,但我不想模拟应用程序在触发内存警告时的行为方式,而是看看应用程序在实际低位时的行为方式记忆环境。
为了增加内存使用时间,我创建了一个调用
的方法char * a = malloc(1024 * 1024);
结果很有趣。 我可能读错了,这就是我想要帮助的地方。
在乐器分配上,在某些时候,我的应用程序在“实时字节”列上使用了超过1GB的内容,但该应用程序没有在真实设备上运行并且工作正常。
在VM Tracker上查看Resident / Dirty size,我得到了不同的结果,居民大约134mb,脏大小78mb。
我在这里缺少什么? 根据文件:
Live Bytes:已分配但未释放的字节数。
Resident Size:正在使用的实际内存量。
为什么结果如此不同? 感谢
答案 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。
希望这有帮助