【问题标题】:Is GC working properly? [duplicate]GC 工作正常吗? [复制]
【发布时间】:2013-01-10 14:03:24
【问题描述】:

可能重复:
.NET garbage collection not working properly here?

我已经测试了以下代码。 单击按钮时,将创建对象并将它们添加到列表中。当另一个按钮被点击时,列表被清除

GC 正在销毁对象,但内存使用量并未减少。 为什么?有什么不对?

public partial class MainWindow : Window
{
    public List<MyModel> MyList;
    public MainWindow()
    {
        MyList = new List<MyModel>();
        InitializeComponent();
    }

    private void button1_Click_1(object sender, RoutedEventArgs e)
    {
        MyList = new List<MyModel>();
        for (int i = 0; i < 1000000; i++)
        {
            MyList.Add(new MyModel { ID = i, Description = "Model Id : " + i.ToString() });
        }
        MessageBox.Show("Complate!");
    }

    private void button1_Click_2(object sender, RoutedEventArgs e)
    {
        MyList.Clear();
        MyList = null;
    }
}

public class MyModel
{
    ~MyModel()
    {
        Console.WriteLine(Description);
    }
    public int ID { get; set; }
    public string Description { get; set; }
}

【问题讨论】:

  • GC 不能保证立即释放内存。通常垃圾收集器在进行垃圾收集之前会等待一段时间,并且根据被释放对象的年龄,大约有三代 GC 在不同的时间发生。
  • 您如何跟踪内存使用情况?您可能会发现这个问题的答案很有用 - stackoverflow.com/questions/6331389/…
  • 即使 GC 决定收集您的对象,它也可能不会将内存释放回操作系统,并且使用外部工具(例如任务管理器)您可能看不到任何差异。

标签: c# .net memory-management garbage-collection


【解决方案1】:

假设您拥有一个仓库。您将箱子存放在仓库中。有些盒子是垃圾,所以你会定期把它们扔掉。 仓库的面积不会变小。

如果您测量的是提交给进程的内存页面总数,那么您测量的不是仓库中的盒子数量,而是仓库的平方英尺。

【讨论】:

    【解决方案2】:

    .Net 垃圾收集器仅在存在内存压力时运行。在许多程序的正常操作中,内存使用量会不断增加,直到您退出程序,前提是您有足够的 RAM。您可以明确要求它执行 GC,但这仍然只是一个建议。

    【讨论】:

    • RAM 与它无关。请记住,RAM 和地址空间是两个完全不同的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多