C# 内存泄漏查询 - 为什么 GC 不释放本地范围的内存?

class Program

{

    static void Main(string[] args)

    {

        Console.WriteLine("Before 1st call TestFunc");

        TestFunc();

        Console.WriteLine("After 1st call TestFunc");

        Console.WriteLine("Before 2nd call TestFunc");

        TestFunc();

        Console.WriteLine("After 2nd call TestFunc");

        Console.ReadLine();

    }


    public static void TestFunc()

    {

        List<Employee> empList = new List<Employee>();

        for (int i = 1; i <= 50000000; i++)

        {

            Employee obj = new Employee();

            obj.Name = "fjasdkljflasdkjflsdjflsjfkldsjfljsflsdjlkfajsd";

            obj.ID = "11111111111111112222222222222222222222222222222";

            empList.Add(obj);

        }

    }

}


public class Employee

{

    public string Name;

    public string ID;

}

我只在一个位置(本地范围)内创建了很多员工,当控件返回主功能时,为什么 DOTNET 不释放内存?假设每个函数调用都使用 1 GB 的内存,在 main 函数结束时,应用程序仍然使用超过 1 GB 的内存。为什么在范围关闭后 GC 不收集?


这可能是一个简单的问题,任何帮助都会很棒。


炎炎设计
浏览 231回答 1
1回答

MM们

GC 不会在作用域或函数调用结束时自动启动。根据 MS 文档:当下列条件之一为真时,就会发生垃圾收集:• 系统的物理内存不足。这可以通过来自操作系统的内存不足通知或主机指示的内存不足来检测。• 托管堆上分配的对象使用的内存超过了可接受的阈值。随着流程的运行,此阈值会不断调整。• GC.Collect 方法被调用。在几乎所有情况下,您都不必调用此方法,因为垃圾收集器会持续运行。此方法主要用于特殊情况和测试。垃圾收集的基础知识
打开App,查看更多内容
随时随地看视频慕课网APP