我有以下简单程序,我尝试使用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
答案 0 :(得分:2)
内存分析工具通过迭代所有GC根并从那里遍历对象图来工作 - 类似于GC。一旦方法超出范围,包含枚举数的局部变量就不再是GC根。任何引用存储在本地且未通过另一个GC根引用的堆对象都无法访问,并且基本上就此消失了。