我正在尝试在使用非常大的字符串的.NET应用程序中调试内存问题。为此,我想在执行的各个阶段设置一些断点并分析堆。
问题是:使用Visual Studio 2015的诊断工具时,似乎只在启动应用程序而不调试时显示堆上的大字符串。这很不方便,因为它阻止我设置断点。
问题:这是一个已知错误吗?或者我错误地使用诊断工具?
如何重现
使用以下代码创建一个新的C#控制台应用程序(.NET 4.6.1):
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
string test1 = new string('a', 100000000);
Thread.Sleep(2000);
string test2 = new string('a', 100000000);
Thread.Sleep(2000);
string test3 = new string('a', 100000000);
Console.WriteLine("Done");
Console.ReadLine();
}
}
激活诊断工具(Ctrl + Alt + F2)并使用调试启动应用程序(F5)。观察内存使用情况并注意每个字符串分配会将内存使用量增加200MB。在内存使用量达到最大值后,获取内存快照并查看堆。
观察到堆上占用最多内存的对象类型是一个10 KB的图标。显然,这是不正确的。