c# - 在 C# 中显式释放内存

标签 c# .net memory memory-leaks profiling

我创建了一个 c# 应用程序,它使用了 150mb 的内存(私有(private)字节),主要是由于一个大字典:

Dictionary<string, int> Txns = new Dictionary<string, int>();

我想知道如何释放这个内存。我试过这个:

Txns = null;
GC.Collect();

但这似乎并没有对我的私有(private)字节造成太大影响——它们从 155mb 下降到 145mb。 有什么线索吗?

谢谢

-编辑-

好吧,我对这段代码有更多的运气(它将私有(private)字节减少到 50mb),但为什么呢?

Txns.Clear(); // <- makes all the difference
Txns = null;
GC.Collect();

-编辑-

好吧,对于所有说“不要使用 GC.collect”的人来说,这很公平(我不会对此进行辩论,只是说你可以看到我的 C 背景),但它并没有真正回答我的问题: 如果我先清除事务列表,为什么垃圾收集器只会释放内存?既然字典已被取消引用,它不应该释放内存吗?

最佳答案

私有(private)字节反射(reflect)进程的内存使用情况。收集对象时,相关的内存段可能会或可能不会释放给操作系统。 CLR 在操作系统级别管理内存,由于分配和释放内存不是免费的,因此没有理由立即释放每 block 内存,因为应用程序稍后可能会请求更多内存。

关于c# - 在 C# 中显式释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/823661/

相关文章:

c# - 我如何从 ASP.NET 站点访问智能卡?

c# - GraphQL 模型在 System.Text.Json.JsonException 中挣扎

java - java在使用整数/ double / float 的情况下是否使用内存

c# - 使用同一个程序集多次调用 Assembly.Load(AssemblyName) 有什么缺点?

.net - IronPython -> .exe 可执行并与所有 DLL 一起分发帮助

java - 为什么 MetaSpace Size 是 Used MetaSpace 的两倍?

c++ - 将参数传递给 exec*() 函数族的内存会发生什么变化?

c# - 具有许多通知的 .NET SqlDependency 与高速率轮询?

c# - 无法加载 WCF 服务中的相关实体

c# - 在不同的进程中运行委托(delegate)