我已经创建了一个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:15:17
私有字节反映了进程的内存使用情况。当对象被收集时,相关的内存段可能会释放给操作系统,也可能不会释放。CLR在操作系统级别管理内存,由于分配和释放内存并不是免费的,因此没有理由立即释放每一块内存,因为应用程序很可能稍后会请求更多内存。
发布于 2009-05-05 07:02:30
如果你调用GC.Collect(),它会开始做它的工作,但它会立即返回,它不会阻塞,所以你看不到它的影响,如果你只是调用GC.WaitForPendingFinalizers()之后,它会阻塞你的应用程序,直到GC.Collect()完成它的工作
发布于 2009-05-05 07:07:05
最有可能的是,您在其他地方隐藏了对字典的引用。因此,字典不会被收集,但是如果您对其执行Clear()操作,则会收集内容。
正如其他人已经注意到的,不建议强制GC。这可能会导致内存被推入更高的“代”,而这些“代”通常不会被收集,从而浪费的内存比长期获得的内存更多。
https://stackoverflow.com/questions/823661
复制相似问题