首页 > 解决方案 > C# 简单的垃圾回收代码不起作用

问题描述

我有一个简单的 WPF 应用程序,它分配内存、清除它并与垃圾收集器交互。不幸的是,我永远看不到收集的垃圾会自动清除内存。例如,假设我单击 Alloc 按钮 10 次它分配一个 gig,然后如果我单击 New 按钮分配的内存不会下降。但是,如果我使用 GC.Collect (GC 按钮)强制进行垃圾收集,它会释放内存。我已经启用了 gcAllowVeryLargeObjects 设置为 true 的大型集合,因为我想使用超过 2 个演出进行测试。知道如何让垃圾收集器自动收集和释放内存吗?

简单的代码摘录:

List<byte[]> m_allocs = new List<byte[]>();

private void AllocClick(object sender, RoutedEventArgs e)
{
  int oneHundredMegsAsBytes = 100000000;
  byte[] array = new byte[oneHundredMegsAsBytes];
  Array.Clear(array, 0, oneHundredMegsAsBytes);
  m_allocs.Add(array);
}

private void NewClick(object sender, RoutedEventArgs e)
{
  m_allocs = new List<byte[]>();
}

private void ClearClick(object sender, RoutedEventArgs e)
{
  m_allocs.Clear();
}

private void GCClick(object sender, RoutedEventArgs e)
{
  GC.Collect();
  GC.WaitForPendingFinalizers();
  GC.Collect();
}

标签: c#garbage-collection

解决方案


你没有。

GC 已开发为仅在需要时运行。如果你的没有运行,那么它不需要。

你不希望它。

GC 很昂贵,GC 必须停止程序并弄清楚需要什么和不需要什么。如果它在每个周期结束时都这样做,你的程序就会变得一团糟。

然而...

您可以将高内存百分比更改为较低的值,这将使 GC 变得更积极、更早。这可能会弊大于利


推荐阅读