我已经创建了一个c#应用程序,它使用了150mb的内存(私有字节),这主要是因为有一个大字典:
Dictionary<string, int> Txns = new Dictionary<string, int>();我想知道如何释放这个内存。我试过了:
Txns = null;
GC.Collect();但它似乎并没有对我的私有字节产生多大影响--比如从155mb下降到145mb。有什么线索吗?
谢谢
-编辑-
好吧,我对这段代码比较幸运(它将私有字节减少到50mb),但是为什么呢?
Txns.Clear(); // <- makes all the difference
Txns = null;
GC.Collect();-编辑-
对于每个说“不要使用麻烦收集”的人来说,这很公平(我不打算讨论这一点,只是说你可以看到我的C背景),但它并没有真正回答我的问题:为什么垃圾收集器只在我先清除事务列表的情况下才释放内存?既然字典已经被取消引用,那么它不是应该释放内存吗?
发布于 2009-05-05 07:12:35
编辑:
公平地说,将引用设置为null并不会释放内存,它会将其容器分配给一个不同的地址,在本例中为null。根据MSDN的说法,调用Clear()会这样做:“Count属性被设置为0,并且从集合的元素对其他对象的引用也会被释放。容量保持不变。”
..。
您永远不应该调用垃圾收集器。您正在使用没有本机资源的托管对象,请相信垃圾回收器会在您之后进行清理。
除了字典的大小,你不需要担心内存,内存不是你的问题,它是垃圾收集器的问题。
调用Clear()将移除对内部包含的任何对象的引用,但容量保持不变。
从技术上讲,收集内存是昂贵的,并且是相当耗时的操作。原因是,GC不仅处理堆内存和清理堆,它还对堆进行某种程度的碎片整理。它试图将内存移动到连续的块中,以便在某些代码发出大型请求时加快分配速度。
附注:你使用的155MB内存的字典有多大?
https://stackoverflow.com/questions/823661
复制相似问题