我创建了一个 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/