c# - 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();
}
解决方案
你没有。
GC 已开发为仅在需要时运行。如果你的没有运行,那么它不需要。
你不希望它。
GC 很昂贵,GC 必须停止程序并弄清楚需要什么和不需要什么。如果它在每个周期结束时都这样做,你的程序就会变得一团糟。
然而...
您可以将高内存百分比更改为较低的值,这将使 GC 变得更积极、更早。这可能会弊大于利。
推荐阅读
- python - Python:点聚类/平均
- tensorflow - tensorflow 2.0, variable_scope(), TypeError: __call__() got an unexpected keyword argument 'partition_info'
- python - 检索搜索结果 selenium python bs4
- php - 使用 PHP 通过 SOAP 请求输入日期时,“00”附近的语法不正确
- angular - 在 coreUI 中使用 app-sidebar-nav 时如何操作 routerLink?
- c# - 如何使这种仅在第一次不适用于特定操作的延迟..但它应该稍后应用?C#
- python - 如何从 QLineEdit 中提取空值;如果用户未能填写 QLineEdit 字段
- excel - VBA从文件路径中提取日期
- indexing - 如何使用 Cypher 更改现有 Neo4j 索引的分析器
- javascript - 使用 React 从另一个组件添加到组件