【问题标题】:Resident memory vs live bytes常驻内存与实时字节
【发布时间】:2013-09-08 13:39:43
【问题描述】:

假设:我正在使用带有 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)并不意味着我不会收到内存不足警告?

【问题讨论】:

    标签: ios xcode memory-management instruments didreceivememorywarning


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的解释。鉴于我的实时字节约为 4/5 MB 并且驻留内存可供操作系统使用,有没有办法理解为什么我的应用程序崩溃?据我了解,操作系统应该释放内存而不是杀死应用程序。
    • 我不接受这个答案,因为我不明白你的意思是“已分配给您的应用程序且尚未被系统回收的内存,但部分/大部分常驻内存可以被系统回收”。这是否意味着常驻内存值与我的APP当前使用的内存无关?我创建了另一个仅关注此问题的答案:stackoverflow.com/questions/18642421/…
    猜你喜欢
    • 2014-02-07
    • 2019-12-10
    • 2011-03-15
    • 2023-03-09
    • 1970-01-01
    • 2012-11-06
    • 2012-09-02
    • 2012-02-06
    • 2020-11-17
    相关资源
    最近更新 更多