分配工具中的 "Anonymous VM" 表示什么?

What does "Anonymous VM" in allocations instruments signify?

我的应用程序经常收到内存警告,但我不知道为什么。 这是分配工具的快照。

我知道我们无法控制分配给我们的虚拟内存,但我想了解 26.50 MB 这个数字对开发人员意味着什么信息。

 1. What does a high VM means ? Does it lead to a jetsam ? Is that cause of any other concern ?
 2. Is this value dependent on device ?
 3. Does a low vm means that your app is memory efficient 
 4. Does a high VM leads to memory warnings in your app ?
 5. What cause this value to change ? 
 6. What steps should a developer take when they see a high vm for their app (like 300 MB) ? 
 7. Is VM tracker instrument related to this value ?

匿名 VM 涵盖了很多内容,其中一些是您想要最小化的内容,而另一些通常不太重要。 "anonymous VM" 的简短版本是您已映射但未命名的地址。堆分配得到 "named",这让您可以将它们作为对象进行跟踪。但是有很多(很多)非对象的东西落入 "anonymous VM" 桶。

分配给 malloc 的东西可能会在这个区域结束。还有内存映射文件。您的可执行文件是一个内存映射文件,但由于它永远不会变脏,因此可以换出其中的一部分。所以 "it's complicated." 但从大的、模糊的角度来说,是的,您确实关心这一部分,但您可能不太关心所有内容。堆分配往往会跟踪您的 ObjC 内容。匿名 VM 经常跟踪您无法直接控制的事物(例如 CALayer 后备存储)。

综上所述,您提供的 Instruments 输出看起来没有任何大问题。我怀疑这并不表示你在给记忆加压。您需要让自己进入内存警告状态,然后查看发生了什么,并深入了解正在使用内存的具体细节。

有关这方面的更多详细信息,您应该观看 WWDC 2013 session 704 "Building Efficient OS X Apps",其中深入介绍了其中的大部分内容。虽然 iOS 的内存系统略有不同,并且一些 OS X 工具在 iOS 上不可用,但许多概念仍然适用。