C# 简单垃圾收集代码不起作用

C# Simple garbage collection code not working

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

简单代码摘录:

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();
}

你没有。

GC 已发展到仅在需要时 运行。如果您的不是 运行ning,则不需要。

你不想要它。

GC 很昂贵,GC 必须停止程序并找出需要和不需要的东西。如果它在每个循环结束时都这样做,你的程序就会变得缓慢。

不过...

您可以将 the high-memory percent 更改为较低的值,这将使 GC 变得更积极、更早。 这可能对你弊大于利

根据您评论中的新信息进行试验时,我找到了解决方案。如果我多次按 alloc,例如直到使用 10 gig,然后单击清除并继续分配更多,它最终会将内存使用量降低到一个较低的值,例如 2 gig。

所以垃圾收集器自动 运行 示例代码,它只在内存使用率高于我测试时使用并且进一步分配有帮助时才起作用。