.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会根据清单检查那个重要物件是否还在,如果不在了,配件也就可以清除掉了。
有米的人,生活就是过的滋润,好好学习,天天向上,做一个让"有米的人"为我服务的人!!