我正在跟踪一个非常严重的内存泄漏(或更可能是被遗弃的内存)情况。我做了以下事情:
1)开始我的申请
2)到达应用程序将显示泄漏的点
3)使用'分配'选择启动工具
4)附加到我的过程并开始记录
5)采取初始快照
6)用VM跟踪器拍摄初始快照
7)重现导致记忆升高的步骤
8)采取另一个快照
9)使用VM跟踪器拍摄另一个快照
如果我执行这些步骤,我会看到实际上没有意义的结果。我希望我遗漏一些有关这些工具如何工作的信息。例如,我知道'泄漏'工具不会跟踪所有类型的内存分配(例如碳应用程序)。我的应用程序是一个庞大的遗留应用程序,可能在我不熟悉的一些过时的子系统中有奇怪的分配代码。也就是说,这就是我所看到的:
那么MALLOC_SMALL如何从72MB增长到224MB,但堆增长只有45MB?分配工具是否缺少VMTracker正在录制的内容?
进一步支持我在分配工具中遗漏了一些内容...如果我查看MALLOC_SMALL下列出的新区域(那些不在第一个快照中但位于第二个快照中的区域),那些地址应对应于页面分配并计入72MB-> 224MB的差异,对吗?那么,我记得该区域的地址范围(例如,0x79000000-0x7b000000),然后返回分配工具并按地址排序“所有对象”列表。然后我寻找该范围内的地址。但是,我只看到4个仅占4KB的分配?! VM跟踪器在该区域报告的其他32MB在哪里?
任何帮助都会受到赞赏....我希望这些工具是如何工作的,我只是不理解。
答案 0 :(得分:3)
不是一个直接的答案 - 但Bill Bumgarner最近在博客中谈到了仪器和内存增长的一些用途:
那里有一些很好的信息......