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

时间:2018-09-08 11:05:23

标签: c# .net c#-4.0 c#-3.0

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的末尾,应用程序仍使用超过1Gb的内存。为什么作用域关闭后GC无法收集?

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

1 个答案:

答案 0 :(得分:1)

GC不会在作用域或函数调用结束时自动启动。根据MS文档:

满足以下条件之一时,将进行垃圾收集:

•系统的物理内存不足。可以通过操作系统发出的内存不足通知或主机指示的内存不足来检测到这一点。

•托管堆上分配的对象使用的内存超过了可接受的阈值。随着过程的运行,此阈值会不断调整。

•将调用GC.Collect方法。在几乎所有情况下,您不必调用此方法,因为垃圾收集器会连续运行。此方法主要用于特殊情况和测试。

Fundamentals of Garbage Collection