代码之家  ›  专栏  ›  技术社区  ›  pj4533

如何解释仪器中分配和虚拟机跟踪器的结果?

  •  5
  • pj4533  · 技术社区  · 14 年前

    我正在跟踪一个非常困难的内存泄漏(或者更可能是被放弃的内存)情况。我执行以下操作:

    1)启动我的应用程序
    2)到达应用程序将显示泄漏的点
    3)使用“分配”选项启动仪器
    4)附加到我的流程并开始录制
    5)进行初始堆快照
    6)使用虚拟机跟踪器进行初始快照
    7)再现导致记忆上升的步骤
    8)再拍一张照片
    9)使用虚拟机跟踪器拍摄另一张快照

    如果我做这些步骤,我会看到一些不太合理的结果。我希望我缺少一些关于这些工具如何工作的信息。例如,我知道“泄漏”工具不会跟踪所有类型的内存分配(例如Carbon应用程序)。我的应用程序是一个庞大的遗留应用程序,在一些我不熟悉的过时的子系统中可能有奇怪的分配代码。也就是说,这就是我看到的:

    • 在vm跟踪器的初始快照中,当我查看摘要时,类型malloc_small在大约72MB(虚拟大小)时相当小。
    • 在第二个快照中,malloc_的小使用量已增长到224MB(也是虚拟大小)
    • 在第二个heapshot中,它告诉我heapgrowth是45MB

    那么malloc-small如何从72MB增长到224MB,而heapgrowth只有45MB呢?分配工具是否缺少vmtracker正在记录的内容?

    进一步支持我在分配工具中缺少某些内容……如果我查看malloc_small下列出的新区域(那些不在第一个快照中,但在第二个快照中的区域),则这些地址应与分配的页对应,并说明72MB->224MB的差异埃伦斯,对吗?然后,我记住了该区域的地址范围(例如,0x79000000-0x7000000),并返回到分配工具,按地址对“所有对象”列表进行排序。然后我在那个范围内寻找地址。但是,我只看到4个分配,它们只占4KB?!虚拟机跟踪器在该区域报告的其他32MB在哪里?

    如果有任何帮助,我将不胜感激……我希望这些工具是如何工作的,而我只是不理解。