运行我的应用程序时,“进程内存”图中显示了无法预料和无法预料的垃圾收集 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();
        }
    }
}

它给了我类似的输出
c# - 在C#中查看垃圾收集历史记录(VS2015)-LMLPHP

因此,您可以看到两个快照之间(相距约5秒),其中有218,242个字符串,char []和Program对象由垃圾收集器收集。通过单击字符串,我们可以看到在其中创建对象的调用堆栈。 (请注意,您确实需要启用“收集分配数据”选项以查看那些调用堆栈,没有它,您将获得总数,而不是对象的来源)

关于c# - 在C#中查看垃圾收集历史记录(VS2015),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43854093/

10-13 07:25