3

我有以下简单程序,我试图将其与 VS 2015 的与内存使用相关的诊断工具一起使用。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Begin");
        Console.ReadLine();
        Goo();
        Console.WriteLine("End");
        Console.ReadLine();
    }

    private static void Goo()
    {
        var list = new List<string>();
        for (var i = 0; i < 1000; i++)
        {
            Foo(list);
        }
    }

    private static void Foo(IEnumerable<string> strings)
    {
        foreach (var str in strings)
        {

        }
    }
}

在分析此应用程序的项目时,我拍摄了几张快照,并希望看到1000装箱的List<string>+Enumerator对象。例如,我在 JetBrains 的dotMemory产品中得到这种信息。但由于某种原因,我无法在 VS 的工具中看到这些信息……我显然遗漏了一些东西……有人能指出我正确的方向吗?

在此处输入图像描述

mscorlib正如您在上面的快照中看到的那样,我仅在没有看到有关我正在执行的程序的任何信息的情况下获得有关模块的信息。我错过了什么?...下面的更多信息:

  • Start Diagnostic Tools Without Debugging在视觉工作室使用
  • 拍摄并打开快照后,我什至取消选择Collapse small objects查看这是否隐藏任何信息的选项,但这也无济于事。

更新(响应用户回答):我使用的是 dotMemory 4.4 版。以下是我从中获得的数据的快照。注意:确保在看到消息Collect Allocations后按任意键之前单击按钮Begin

在此处输入图像描述

4

2 回答 2

2

当您在“结束”点获取快照时,已收集在 Goo 和 Foo 中创建的所有对象。我使用 dotMemory 10.0.1 分析了这段代码,也没有看到在 Goo 和 Foo 方法中创建的任何对象。

更新:在 dotMemory 中,您正在查看“内存流量”视图。内存流量- 是创建的对象,并且可能已经收集到某个时间点。dotMemory 向您显示无法显示收集到的对象的警告。如果您在分析设置对话框中选中“立即开始收集分配数据”复选框,dotMemory 将显示这 1000 个对象已分配并已收集。在 VS 诊断工具中,您正在查看实时对象图。我对这个工具不是很熟悉,但似乎没有关于内存流量的信息。

如果您查看 dotMemory 中的活动对象图(“所有对象”视图),您也不会找到这些对象。

于 2015-11-23T18:24:27.897 回答
2

The memory analysis tool works by iterating all of the GC roots and traversing the object graphs from there - similar to what the GC does. Once the method is out of scope, the local variable containing the enumerator is no longer a GC root. Any heap objects whose reference is stored in a local and is not referenced through another GC root are unreachable and essentially gone at that point.

于 2015-11-24T21:39:59.603 回答