为什么Activity Monitor报告的内存使用量与分配工具之间存在差异

时间:2011-01-04 16:42:08

标签: objective-c memory allocation

我面临着非常奇怪的问题。

申请~80.Mb

使用Allocations Instrument在模拟器上进行测试,向我显示当前正在使用大约30 Mb,但是当使用Activity Monitor在iPod 4g上进行测试时显示“物理内存使用~133Mb”和“物理内存可用~77Mb”

由于内存警告,我的应用程序不断崩溃。

ActivityMonitor和Allocations Instrument中使用的物理内存有什么区别?

早些时候我已经信任Allocations Instrument,因为当我释放对象时,使用的内存量减少了,但在ActivityMonitor中,USED内存的数量以一种奇怪的方式增加和减少,而不依赖于我正在做的事情。 所以,帮助我理解,因为我认为分配的内存与使用的内存相同,或者我错了?

修改 似乎我理解数据在activitymonitor中的显示方式。但问题仍然存在。在ActivityMonitor中,图表下方有一列。在那里我找到了我的申请。记忆力只会增加。

没有泄漏100%

1 个答案:

答案 0 :(得分:12)

Activity Monitor对于开发/调试目的无用。 AM仅在您没有仪器运行时才有用。你看到RPRVT随着时间的推移而显着增长。即便如此,它只是一种症状,并不代表真正的问题。

AM总结了一组不同的内存相关数字。这是一个非常粗略的数字。 Allocations工具正在总结您的应用程序中的分配集(在Mac OS X下,可以包括GC和非GC分配)。减少分配,整体内存使用量通常会下降。

请注意,不受内存压力影响的系统通常不会请求应用程序返回内存。也就是说,您可能看不到活动监视器数量的下降。

另请注意,“100%无泄漏”仅占减少内存使用总体努力的10%左右。您的应用程序因为令人震惊的内存消耗而被抛弃。这可能是因为一个架构问题,你的应用程序的算法使用大量内存的方式,或者因为你的应用程序正在分配和放弃内存。被遗弃的记忆可能不会显示为泄漏;如果你有一个只写缓存,其中一个项目的重复项一遍又一遍地放入缓存中,但从未检索过,你的内存使用将增长到失败,但泄漏将显示没有泄漏。

泄漏只是一个没有可行参考的对象。一个有效引用的对象可能仍然有效地泄漏!

Heapshot analysis在解决这类问题时非常有效。