.Net Framework CLR 之自动内存管理

微软的.Net架构极大的降低了程序员的门槛,.Net使得开发变得简单,这是因为有了CRL。CRL就像一个贴心的管家,帮助开发人员处理很多事情,其中之一就是内存管理。

珍爱程序生命,远离内存管理 J 内存泄漏很危险滴

CRL这个管家是如何管理内存的呢?

主人(程序进程)每天都要穿衣服、袜子、鞋,要带手表、眼镜等(这些就好比程序中的各种对象 - 全局对象、静态对象、局部变量和引用对象参数等等)。咱们这个贴身管家为我们的穿戴配件精心设计了一个大个的衣柜(托管堆:内存中的一个连续的地址空间区域),整个衣柜分为了4个区域:0、1、2区,每个区都有很多抽屉(托管堆分为三代:第 0 代、第 1 代和第 2 代)还有个大件区(单独堆存放大型对象)。

管家为了管好主人的物品,还找了个小跟班,英文名叫GC(垃圾回收器),并且制定了一个策略去管理这个衣柜:

  • 大件物品放到大件区;
  • 0~2区的抽屉都要顺序使用,先从0区开始。为了快速找到该使用哪个抽屉,在那个抽屉上贴上个标记;
  • 但凡有新来的东东,小跟班GC都会先去0区找到有标记的抽屉,放好东西后,把标记移到下一个抽屉上;
  • 当0区抽屉都装满后,小跟班GC进行一次清理工作(垃圾回收):检查0区哪些东东是不用的可以扔掉的(富人就是能败家)。然后整理(压缩内存):让空抽屉顺序连续;并迁移(升级):把有剩余用的顺序移到1区的抽屉中;
  • 当0区抽屉被装满后,小跟班GC进行一次清理工作,如果回收后剩下的抽屉,不能放下新来的东西,则对1区的抽屉进行清理工作,之后对2区进行清理;如果仍不能清理出足够的空抽屉,则依次对第2、1、0区进行清理;
  • 每次0区清理,都依次对0、1、2区进行整理和迁移,直到无法放入新物件。(此时通知富人东西太多,已无法存放,哈哈)

那小跟班GC是如何找到那些可以清空的抽屉呢(释放内存)?

由于有米的主人穿戴都是配套的(程序运行时创建的各种对象),而且一旦最重要的物件(应用程序的根)不要了,其他物品也变得没用了。GC会按套记录这些物品的对应清单,当进行清理工作时,GC会根据清单检查那个重要物件是否还在,如果不在了,配件也就可以清除掉了。

有米的人,生活就是过的滋润,好好学习,天天向上,做一个让"有米的人"为我服务的人!!

转载于:https://www.cnblogs.com/JamesL/archive/2011/05/12/2042715.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值