以下是我的程序在使用内存非常密集,在其峰值时消耗6 GB,但随后将所有内容保存到磁盘并且在范围内留下的内容时的统计信息:
观察到几乎所有内容都已超出范围并且已被垃圾收集 - 堆大小很小。然而,.NET保持181 MB 提交。
我不介意保留字节,因为它只占用地址空间。但是承诺的内存很烦人 - 即使它只存在于页面文件中,它仍然存在很多。
答案 0 :(得分:7)
根据CLR Inside Out - Large Object Heap Uncovered,CLR在Gen 2垃圾收集期间解除未使用的已提交内存。
这意味着您可以等待Gen 2垃圾收集单独发生,也可以使用GC.Collect()
强制进行 - 你真的需要知道你在做什么你选择这条路线,因为它与垃圾收集器标准的垃圾收集周期混淆,这可能真的搞乱性能:
据我所知(从我相当有限的研究中),CLR不会在其他情况下释放已提交的内存。
您还应该考虑这是否真的是一个问题:
更新: Advanced .NET Debugging: Managed Heap and Garbage Collection似乎支持这样的假设:内存仅在第2代/完整集合期间未提交:
当收集第2代中的对象时,CLR堆管理器会解除段中的内存,并且当不再需要某个段时,它将被完全释放。