运行我的应用程序时,“进程内存”图中显示了无法预料和无法预料的垃圾收集 Activity 量,这使我想知道程序在何处生成了垃圾,因为我不觉得自己有任何内存泄漏该程序。有人可以告诉我是否可以查看我的代码中产生垃圾的部分(或行)吗?
提前致谢。
最佳答案
几乎所有内存分析器都会显示此信息。只需查找两个快照之间的“死对象”列表,这就是生成的并且需要由GC收集的“垃圾”列表。
我个人使用JetBrains的DotMemory。
例如下面的程序
using System;
namespace SandboxConsole
{
class Program
{
private int _test;
static void Main(string[] args)
{
var rnd = new Random();
while (true)
{
var obj = new Program();
obj._test = rnd.Next();
Console.WriteLine(obj);
}
}
public override string ToString()
{
return _test.ToString();
}
}
}
它给了我类似的输出
因此,您可以看到两个快照之间(相距约5秒),其中有218,242个字符串,char []和Program对象由垃圾收集器收集。通过单击字符串,我们可以看到在其中创建对象的调用堆栈。 (请注意,您确实需要启用“收集分配数据”选项以查看那些调用堆栈,没有它,您将获得总数,而不是对象的来源)
关于c# - 在C#中查看垃圾收集历史记录(VS2015),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43854093/