以下是我的程序在极其密集地使用内存后的统计数据,在峰值时消耗 6 GB,但随后将所有内容保存到磁盘并在范围内留下很少的内容:
观察到几乎所有内容都超出了范围并已被垃圾收集- 堆大小很小。然而,.NET 保留了 181 MB坚定的.
我不介意保留字节,因为那只消耗地址空间。但提交的内存很烦人——即使它只驻留在页面文件中,它仍然相当多。
根据CLR 彻底揭秘 - 大型对象堆揭秘 http://msdn.microsoft.com/en-us/magazine/cc534993.aspxCLR 在第 2 代垃圾收集期间回收未使用的已提交内存。
这意味着您可以等待第 2 代垃圾回收自行发生,也可以使用强制垃圾回收GC.Collect()
- you really但是,如果您选择此路线,则需要知道您在做什么,因为它会扰乱垃圾收集器的标准垃圾收集周期,这确实会影响性能:
- 完整的垃圾收集速度很慢,因此您真的不想太频繁地执行此操作
- 比标准计划更频繁地触发垃圾收集会将额外的对象提升到更高的代,这意味着它们可能不会像正常情况下那样尽快被收集
据我所知(根据我相当有限的研究),CLR 在其他情况下不会释放已提交的内存。
您还应该考虑这是否确实是一个问题:
- 如果您的进程要立即继续执行额外的内存密集型处理,那么它将很快再次需要该内存,因此无论如何解除该内存并没有多大好处
- 如果您的进程已完成并将很快终止,那么内存无论如何都会被解除使用
- 无论如何,提交那么多内存并不一定会带来很大的缺点 - 是的,这意味着内存分配了一个后备存储,但是如果系统面临内存压力,那么该后备存储可能是一个页面文件反正。
Update: 似乎支持这样的假设:内存仅在第 2 代/完整收集期间未提交:
当收集第 2 代中的对象时,CLR 堆管理器会回收段中的内存,当不再需要某个段时,它会被完全释放。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)