应用程序收到内存不足警告但只有 5.7MB 的活动字节

Posted

技术标签:

【中文标题】应用程序收到内存不足警告但只有 5.7MB 的活动字节【英文标题】:App receiving low memory warning but only has 5.7MB of live bytes 【发布时间】:2013-11-15 20:22:22 【问题描述】:

我的应用因重复操作而收到内存不足警告并最终崩溃。当我在仪器中进行分析时,崩溃时我只看到 5.7 MB 的活动字节。 (崩溃显示没有回溯,没有错误等。它只是终止,这表明内存崩溃。)

为什么我的应用程序因内存占用如此之低而崩溃?我一直在 iPad 1 上测试 ios 5.1。

编辑: 我能够修复崩溃。这是由于对具有 3 个 UIImages 作为属性的对象进行了额外的保留调用。这些对象的堆积导致内存警告和崩溃。

但是,问题仍然存在:为什么 Instruments 显示只有 5.7MB 的活动字节?这可能是由于UIImage's 自动缓存造成的吗?

【问题讨论】:

崩溃可能不是由于内存不足。什么是崩溃错误? 好主意,但没有给出回溯或错误。它只是终止。 (我已在编辑中将此添加到问题中。) 看来您确实应该确定崩溃的确切来源。见My App Crashed, Now What? 另一种想法是,如果您在仪器中添加按钮库“内存监视器”工具,您还可以看到您的内存如何下降 这可能是内存工具本身的问题,因为当 NSMutableString 由于我的逻辑错误而不断增长时,我也发生了类似的事情。我所看到的只是内存警告和应用程序在几次之后崩溃,但当时的内存使用量仅为约 8 MB。症状是内存迅速增长到约 8 MB,在那里保持了大约几分钟,然后警告就来了。一段时间后,应用程序挂起并崩溃,有什么意义吗? 【参考方案1】:

您是否在环境变量中将 NSZombieEnabled 设置为 YES?

启用僵尸时,内存永远不会真正释放,而是保留在僵尸池中以调试对无效指针的引用。

【讨论】:

【参考方案2】:

我在您发布的代码中看不到任何明显的泄漏,但如果您只是想重绘图像(可能是为了强制立即解压缩),那么这是一种非常复杂的方法。只需这样做:

- (void)loadImage:(UIImage *)image

    UIGraphicsBeginImageContextWithOptions(image.size, image.scale);
    [image drawAtPoint:CGPointZero];
    self.someImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

希望这将解决您所看到的任何泄漏。

【讨论】:

是的,在该方法的中间有很多逐个像素的操作,为了简单起见,我将其删除。当我注释掉该代码时,同样的问题仍然存在,所以我认为它与显示无关。

以上是关于应用程序收到内存不足警告但只有 5.7MB 的活动字节的主要内容,如果未能解决你的问题,请参考以下文章

Instruments 指出内存不足警告,但内存使用率非常低

iOS 应用程序以 350MB 大小发出低内存警告

在 ARC 中收到内存警告

使用仪器解决内存不足警告

Spark:广播对象时内存不足

应用程序因内存使用率非常低而崩溃 iphone/iPad