【发布时间】:2011-04-30 18:41:29
【问题描述】:
我正在跟踪一个非常严重的内存泄漏(或更可能是废弃的内存)情况。我执行以下操作:
1) 启动我的应用程序
2) 达到应用程序将显示泄漏的程度
3) 使用“分配”选项启动工具
4) 附加到我的进程并开始录制
5) 获取初始快照
6) 使用 VM 跟踪器拍摄初始快照
7)重现导致内存上升的步骤
8) 再拍一张
9) 使用 VM 跟踪器拍摄另一个快照
如果我执行这些步骤,我会看到毫无意义的结果。我希望我错过了一些关于这些工具如何工作的信息。例如,我知道“泄漏”工具不会跟踪所有类型的内存分配(例如碳应用程序)。我的应用程序是一个巨大的遗留应用程序,在我不熟悉的一些过时的子系统中可能有奇怪的分配代码。也就是说,这就是我所看到的:
- 当我查看摘要时,在 VM 跟踪器的初始快照中,MALLOC_SMALL 类型相当小,大约为 72MB(虚拟大小)
- 在第二个快照中,MALLOC_SMALL 的使用量已增长到 224MB(又是虚拟大小)
- 在第二个 heapshot 中,它告诉我 heapgrowth 是 45MB
那么MALLOC_SMALL怎么能从72MB增长到224MB,但是heapgrowth只有45MB呢? Allocations 工具是否缺少 VMTracker 正在记录的内容?
进一步支持我在分配工具中遗漏了一些东西......如果我查看 MALLOC_SMALL 下列出的新区域(不在第一个快照中但在第二个快照中的区域),这些地址应该对应于页面已分配并解释了 72MB->224MB 的差异,对吗?因此,我记住了该区域的地址范围(例如,0x79000000-0x7b000000),然后返回分配工具并按地址对“所有对象”列表进行排序。然后我寻找该范围内的地址。但是,我只看到 4 个仅占 4KB 的分配?! VM 跟踪器在该区域报告的其他 32MB 在哪里?
任何帮助将不胜感激....我希望这是我不理解的关于这些工具如何工作的基本知识。
【问题讨论】:
标签: performance macos memory-leaks instruments