【问题标题】:Memory Usage Difference b/w Debug and Release Configuration调试和发布配置之间的内存使用差异
【发布时间】:2014-03-21 01:24:07
【问题描述】:

我正在使用taskInfo 以编程方式获取我的应用程序使用的内存量。代码基本上是

    kern_return_t result = task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &num);
    if (result == KERN_SUCCESS ) {
        memoryUsed = (double)(info.resident_size/1000000.0);

当我在Debug 配置上运行我的应用程序时,它报告的内存使用量比我在Distribution 上运行它时要多得多(差异约为 100MB)。由于链接了其他一些第三方库,我不确定他们是否在做一些奇怪的事情。

我的问题是假设我的应用程序没有做任何奇怪的事情,有如此巨大的差异是否正常?

附: :我也在使用cocos2d,但我认为这很安全。

【问题讨论】:

  • 我已经多次观察(测量)相同的情况。事实上,我修改了 CCDirector 以在调试和发布模式下向我展示 FPS 和内存,只是为了尝试量化这一点。至于正常性,从我的角度来看,期望来自 xCode 和仪器的垃圾信息已成为“正常”。 .02
  • 在您的调试方案中,您是否选择了内存调试选项(例如僵尸)?这些会影响你的内存消耗。
  • @Rob 不,我没有,我也先考虑过,但我已经剥离了我的计划,没有多余的东西。

标签: ios objective-c cocos2d-iphone


【解决方案1】:

我会说这是预期的行为。至少在我比较 DEBUG 和 RELEASE 构建之间的内存使用情况的所有项目中,一直都是这样。

一个原因显然是在 DEBUG 构建中正在完成更多的事情并且可能保存在内存中。主要调试东西,你的和框架的(即 cocos2d)。各种断言和日志也会增加更多(临时)内存使用。连接的调试器和调试服务也可能会消耗属于应用的额外内存。

没什么好担心的。仅在发布版本中衡量您的内存使用情况,因为这最终会在用户的设备上运行。

【讨论】:

  • 在 IDE 连接到正在运行的进程的情况下运行时,内存消耗会以可测量的恒定速率增加。但是,相同的构建,当在设备中独立运行时,进程大小不会随着时间的推移而增加。所以是的,有必要的 do-hickies 来支持调试相关任务,但也有这个:stackoverflow.com/questions/19234526/…
【解决方案2】:

ARC 对编译器的优化设置很敏感。

应用的默认调试配置会关闭优化 (-O0)。这会导致 ARC 在它插入的 retains 和 autoreleases 中变得迂腐(冗余?),这反过来可能会增加对象的生命周期,超出人们通常的预期。

另一方面,默认发布配置已开启优化 (-Os)。这会导致一些retain/release 对被优化出来(我认为它也减少了autorelease 的使用频率?)最终导致deallocing 对象更早,这意味着您将拥有更少的对象闲逛。

试试这个:转到您的构建设置,然后在“代码生成”部分下更改调试配置的“优化级别”。看看在那之后你是否仍然看到更多的内存被使用。

【讨论】:

  • 不,这不是我更改优化级别的问题,它没有产生任何重大变化。 ARC 的 100MB 差异也意味着正在创建的大量对象没有发生。分配揭示了 30MB 的使用量,这表明通过对象的差异超过 100MB 是不合理的。我认为它必须是纹理,但我无法确定是什么。此外,这种内存差异是当我在游戏中达到稳定状态时没有对象被创建或销毁,所以我认为 ARC 不会导致它。
【解决方案3】:

在玩了一段时间后,我发现 cocos2d 或任何其他框架都没有任何问题。

相反,有一段毛茸茸的代码正在做类似

的事情
dispatch_async(dispatch_get_global_queue(DEFAULT, 0), ^{
    for(int i = 0; i < 100000; i++) { // a big loop
        [a.b doSomethingAtIndex:i];
    } 
});

对象a 被实现为代理对象并使用forwardInvocation: 来解析消息调用a.b,因此这些调用被分配但从未被删除,因为它没有被任何@autorelease pool 包围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2010-10-09
    • 2011-02-04
    • 2017-05-07
    • 2013-08-06
    • 1970-01-01
    • 2022-10-16
    • 2012-08-01
    相关资源
    最近更新 更多