搜索

Net陷阱破解:大对象堆碎片化处理

gecimao 发表于 2019-04-18 21:18 | 查看: | 回复:

  2017-08-08 14:48it168网站原创 作者: 编译丨许线 评论】了解垃圾回收机制对使用.Net很重要。CLR管理两个独立的堆,即小对象堆(SOH)和大对象堆(LOH)。本文将重点介绍运行时如何管理大对象堆、大对象堆产生内存碎片的原因以及大对象堆(LOH)内存碎片最小化的方法。

  垃圾回收器会适当清理不使用的应用程序。小对象堆和大对象堆的在垃圾回收器中工作方式不同,我们先来了解一下小对象堆的工作方式。

  小对象堆垃圾收集采用压缩的方法,这意味着当收集到未使用的对象时,GC将活动对象移动到间隙、消除碎片,以确保可用内存连续。当然,压缩包括开销——两个CPU周期和用于复制对象的附加内存。压缩会在小对象堆上自动执行,这样就大大降低小对象的成本。

  但以上压缩方法由于成本太高,不适用于大对象堆(大于85K)。除此之外,复制和移动大型对象会涉及到垃圾收集器巨大开销、GC需要的内存是垃圾收集的两倍、再次移动大对象也会非常耗费时间也是不适用于大对象堆的主要原因。所以大对象堆的垃圾收集不采用压缩的方法。那大型对象堆中的内存如何回收?

  虽然GC不对大对象堆进行压缩,但是会将其中的相邻空闲块连在一起,这样会创造一个更大的空闲块,并将其作为优化策略添加到空闲列表中。

  推荐的做法是识别应用程序中的大对象,然后将其分割成较小的对象——也可能会使用一些包装类(wrapper class)。另一种是重新设计应用程序,在设计过程中避免大对象的使用。还可以定期回收应用程序池。

  虽然GC本身不会压缩大对象堆,但我们可以采用代码对大对象堆进行压缩。以下代码片给出实现过程:

  总而言之,垃圾收集器运行时将小对象堆作为优化策略的一部分来消除大对象堆内存漏洞,但是永远不会因为性能对大型对象堆进行压缩处理。但如果在x86系统中运行使用许多大对象的程序,可能会遇到OutOfMemory异常,如果在x64系统中运行,可能会有碎片化堆的生成。通过了解垃圾收集机制和大对象堆的复杂性,我们可以采用避免内存碎片化的策略帮助应用程序正常运行。

本文链接:http://robynlynne.com/duixiangguanliqi/174.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部