2

假设:我正在使用带有 ARC 的 Cocos2d 2.0 开发一个 iPhone 项目(并使用 XCode 4.5.2 的仪器)。

简短的问题:为什么常驻内存比实时字节高得多?

我这样说是因为:

使用工具: 我确实收到内存不足的警告,我运行我的分配工具并看到平均 3/5 MB 的实时字节。然后我得到一个峰值(18MB),然后又回到 3/5MB。问题是,每当我从一个场景到另一个场景来回前进时,我都会收到内存不足的警告。

在此处输入图像描述

使用常驻内存控制台打印

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    [self report_memory];
    [[CCDirector sharedDirector] purgeCachedData];
}

-(void) report_memory {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
                               TASK_BASIC_INFO,
                               (task_info_t)&info,
                               &size);
if( kerr == KERN_SUCCESS ) {
    NSLog(@"Memory in use (in bytes): %u", info.resident_size);
} else {
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
}

我确实收到内存警告,第一次打印是 48MB,然后是 48MB,然后是 66MB,然后..崩溃!

所以我想知道,为什么人们说我应该只担心Live Bytes

换句话说,假设我的应用程序是唯一一个正在运行的应用程序(所有其他应用程序都被杀死),我可以说具有非常低的活动字节(从 4MB 到 20MB)并不意味着我不会收到内存不足的警告吗?

4

1 回答 1

3

您的问题的简短回答是“是”。低活动字节并不意味着您不会收到低内存警告。我之所以这么说是因为我在几个不同的场合看到了内存警告,同时 Instruments坚持我的应用程序的实时字节是相当合理的。

然而,绝大多数情况下,低活动字节数是一个很好的指标,表明您的应用程序没有使用太多内存,如果您正在寻找内存峰值或泄漏的间接证据,则活动字节数是要观察的数字。

常驻内存是对已分配给您的应用程序但尚未被系统回收的内存的度量,但部分/大部分常驻内存可以被系统回收。实时字节是分配给您的应用程序的内存,目前系统无法回收。因此,您应该期望您的应用程序的常驻内存始终高于(通常远高于)其活动字节。

于 2013-09-04T22:20:43.040 回答