为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
炎炎设计 2022-01-09 14:34:36
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 不收集?这可能是一个简单的问题,任何帮助都会很棒。
查看完整描述

1 回答

?
MM们

TA贡献1886条经验 获得超2个赞

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

当下列条件之一为真时,就会发生垃圾收集:

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

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

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

垃圾收集的基础知识


查看完整回答
反对 回复 2022-01-09
  • 1 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号