大对象堆及.NET垃圾回收器的改进
时间:2011-10-21
来源:cnblogs
当 .NET 开发者编写内存密集型(memory intensive)应用程序的时候,即便总体内存看起来非常充足,也经常会在大对象堆的分配上遇到问题,产生 out-of-memory 异常。微软承诺会在 .NET Framework 4.5 中对此做出改进,其中会有更好的 LOH 管理,产生的内存碎片会更少。
CLR 会管理两种独立的堆并对其进行分配,小对象堆(small object heap,SOH)和大对象堆(large object heap,LOH)。所有大于85,000 byte 的内存分配都会在 LOH 上进行。你可以阅读这些文章,以进一步了解这两种堆之间的区别。 为了在 LOH 中换取性能,需要消耗大量内存的应用程序——像繁重的图像处理程序——会面临内存碎片的问题,并且可能在使用到最大限制的内存之前就发生 OutOfMemory 异常。
.NET 在从 3.5 向4.0升级的时候,已经在总体内存分配方面做出了一些改进。负责 .NET Framework 的垃圾回收器的资深项目经理 Brandon Bay 对上述问题做出评论,他说:
基于所提供的示例,执行了从3.5到4.0的升级之后,在耗尽大对象堆上的内存之前,我们可分配的内存增加了22倍。
而现在 .NET 4.5 看起来是在此基础之上构建的:
在 .NET 4.5 中,我们对大对象堆做出了两项改进。首先,我们显著改进了运行时管理空闲列表的方式,从而能够更有效地利用碎片。现在,内存分配器可以重新访问到之前版本中的分配器无法使用的内存碎片。其次,当处于服务器垃圾回收(server GC)模式时,运行时会在每个堆之间平衡 LOH 的分配。而在 .NET 4.5 之前,我们只能针对 SOH 做出平衡。在 LOH 分配评测中,我们发现这两种改变让结果有了实质上的改善。
你可以阅读 Brandon 的完整文章以获得更多细节。想要了解更多关于 .NET Framework 垃圾回收器的工作原理,你可以参考 MSDN 文档以及 Andrew Hunter 的这篇文章。
查看英文原文:Large Object Heap And .NET GC Improvements
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28