【问题标题】:Unreasonable Heap Growth不合理的堆增长
【发布时间】:2012-12-23 06:50:40
【问题描述】:

您好,我对分配的内存有疑问,因为我在 Instruments 中注意到很多堆增长,所以我设计了一个测试应用程序。

测试应用包含两个 ViewController,每个都有一个按钮。 第一个 ViewController 通过 Segue Modal 链接到 SecondViewController(它根本没有代码 - 除了自动生成的)。

第二个ViewController只有功能

 -(IBAction)back:(id)sender{
      [self dismissModalViewControllerAnimated:YES];
}

所以我可以翻转抛出视图。

当我使用 Instrument 对其进行测试时,我注意到在我转到第二个视图并返回后堆增长。

这怎么可能?我错过了什么?

【问题讨论】:

  • 500KB 对你来说不合理吗?你期待什么?
  • 我理解它应该是0。如果你以相同的状态返回它应该没有任何内存增长,或者我错了?
  • 堆的大小不是应用内存使用量。
  • 是的,我知道。如果我没记错的话,内存堆是两个堆标记之间使用的内存。 HeapSpot 3 在移动到第二个屏幕和返回之间进行。因为我以与使用 HeapSpot 之前相同的位置结束,所以它应该是 0,不是吗?
  • 看我的回答。希望它会足够清楚。

标签: ios memory memory-management instruments heapsort


【解决方案1】:

堆的大小不是应用内存使用量。

当您的应用程序运行时,内核必须为您分配内存。
现代系统使用虚拟内存。基本上,它们将物理地址映射到您的进程将访问的虚拟地址。

这个映射由内核处理,它需要内存。

如果您请求 1MB 内存,则必须通过增加地址空间的大小来分配内存以跟踪分配的物理页面。

如果您释放所有内存,内核通常会保留用于映射的内存,并将其重新用于下一次分配,避免为它重新分配空间。

这就是堆大小不变的原因。但它根本不表示您的应用程序的内存使用情况。

如果使用 Instruments,请查看 VM Tracker 工具。

【讨论】:

  • 嗯,也就是说34KB用于映射? (参见堆点 3)。旁边的数字表明有 368 个新对象仍然存在。我不确定是不是这样。连friday.com/bbum/2010/10/17/…博客都说应该是0。
猜你喜欢
  • 2011-03-23
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2015-04-25
  • 2011-04-04
  • 2012-10-08
  • 1970-01-01
相关资源
最近更新 更多