.Net的垃圾自动回收机制之一

.Net的垃圾自动回收机制之一

内存管理是软件开发过程中相当重要的一环。据调查,软件故障中大多数异常均是于内存管理相关,比如野指针,比如重复释放,再比如内存泄露等。

为提高软件开发效率,很多开发平台如.Net, Java 等提供了垃圾自动回收机制(GC),替开发人员管理内存。

那么这垃圾回收机(GC)是如何分配内存的?又是如何释放垃圾内存的?GC有内存碎片的问题吗?

在开始回答这些问题之前,我们先来看一下CLR堆的管理结构,CLR堆有两种工作模式:工作站模式与服务器模式。

从上图可以看出服务器模式与工作站模式最主要的区别在于服务器模式在每一个处理器上都单独部署了一个CLR堆。

每一个CLR堆由两部分组成,即小对象堆(Small Object Heap)与大对象堆(Large Object Heap), 而不管是 Small Object Heap 还是Large Object Heap 都是堆段组成, 其中Small Object Heap 第一个堆段被称作是临时段(Ephemeral Seg

Large Object Heap 顾名思义,就是管理大对象的堆,超过85000Bytes)的对象在Large Object Heap上分配。

CLR堆为什么要如此设计?关键在于CLR堆在内存回收里有一个内存压缩整理动作,而对象的压缩整理耗时与对象大小有直接关系,所以CLR堆为减少GC的时间,设计了Large Object Heap, 也就是说Large Object Heap在垃圾回收过程中没有压缩整理过程。

通过SOS.dll的扩展命令eeHeap可以查看内存情况,

从上图可以看到,CLR 堆有一个Large Object Heap 范围在0313000~03135328

一个临时堆(02131000~02135ff4),该临时堆初分成了generation 0,generation 1,generation 2.

后面将会谈到CLR堆的generation 管理机制。 未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值