gpt4 book ai didi

ios - 使用仪器解决低内存警告

转载 作者:技术小花猫 更新时间:2023-10-29 10:41:32 25 4
gpt4 key购买 nike

我正在尝试使用仪器解决一些内存不足的情况。我可以在 Physical Memory Free 监视器中看到内存消耗下降到几 MB,尽管 Allocations 显示 All Allocations 大约是 3 MB,Overall Bytes 是 34 MB。

自从我使用 NSOperationQueue 将一些操作移动到单独的线程后,我就开始遇到崩溃。但在改变之前我没有使用乐器。尽管如此,我敢打赌我做了一些我可以撤消的事情来阻止崩溃。

顺便说一下,它在没有连接仪器或调试器的情况下要稳定得多。

我几乎没有泄漏(崩溃前可能最多有一百个字节)。

当我查看 Allocations 时,我只看到非常原始的对象。而且它报告的总内存也很低。所以我看不到我的应用程序是如何导致这些低内存警告的。

当我从头开始查看 Heap Shots 时,在基线和所有堆增长值的总和之间,我看不到超过 3 MB。

我应该查看什么才能找到问题所在?例如,我可以将它隔离到我的 View Controller 实例之一吗?或者我的其他实例之一?

我做了什么:我关闭并重新打开设备电源,这带来了显着的改进。 Instruments 没有报告低内存警告。另外,我注意到启动时的物理可用内存在重新启动前只有大约 7 MB,而在重新启动后大约有 60 MB。

但是,我发现物理可用内存有规律(周期性)下降,从 43 MB 下降到 6 MB(然后又下降到 43 MB)。我想知道是什么原因造成的。我没有在此应用程序中运行任何计时器。 (我确实有一些 performSelector:afterDelay:,但在这些测试期间它们并不活跃。)

我没有使用 ARC。

最佳答案

allocationsleaks 工具仅显示对象实际占用的内容,而不显示其底层非对象结构(后备存储)占用的内容。例如,对于 UIImages,它会显示你有一些分配的字节。这是因为 UIImage 对象只占用这些字节,但实际包含图像数据的 CGImageRef 不是对象,并且在这些工具中没有考虑到。

如果您还没有这样做,请尝试在运行分配工具的同时运行 VM Tracker。它会让您了解正在分配的内存类型。对于 iOS,此仪器显示的“脏内存”通常会触发内存警告。 脏内存 是不能被 VM 系统自动丢弃的内存。如果您看到很多 CGImage,图像可能是您的问题。

另一个重要的概念是abandoned memory。这是已分配的内存,它仍然在某处被引用(因此不是泄漏),但未被使用。这种类型的内存的一个例子是某种缓存,它在内存警告时没有释放。找出这一点的一种方法是使用堆射击分析。按分配工具的“Mark Heap”按钮,做一些操作,返回到应用程序中的上一个点,然后再次按“Mark Heap”。第二个堆快照应该向您显示在这两个时刻之间分配了哪些新对象,并且可能会揭示一些谜团。您还可以重复模拟内存警告的操作,以查看该行为是否发生变化。

最后,我建议您阅读这篇文章,它解释了所有这些是如何工作的:http://liam.flookes.com/wp/2012/05/03/finding-ios-memory/ .

关于ios - 使用仪器解决低内存警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9461490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com