CLR中的垃圾回收机制
CLR中采用代(generation)来作为其垃圾回收的一种机制,其唯一的目的是提升程序的性能。基予代的垃圾回收器有以下假设:
·对象越新,其生存周期越短。
·对象越老,其生存周期越长。
·回收堆的一部分,速度快于回收整个堆。
托管堆在初始化时不包括任何对象。添加到堆的对象称为第0代对象。下图展示一个新启动的应用程序,其分配了五个对象(A-E)。运行一段时间后,C、E变为垃圾。

CLR初始化时,它会为第0代对象选择一个初始容量,假定为256KB。当分配对象时,一旦第0代超出这个数值,就必须启动一次垃圾回收。假如A-E刚好占用256KB,分配F时,会启动垃圾回收。此时,C和E被判断为垃圾,所以压缩D,使之与B相邻(定义容量为256是因为所有这些对象都可以放到CPU的L2缓存,使内存的压缩能以非常快的速度完成)。此时尚存活的对象A、B、D变为第一代对象。

经过一次垃圾回收后,第0代就不包含任何对象了,此时新对象分配到第0代。假如新分配了F-K,且B、H、G变为垃圾。

假如分配新对象L时造成第0代超出预算,此时启动垃圾回收检查第0代。而且其还要为第一代选择一个容量预算,假设为2M。开始垃圾回收时,垃圾回收器会检查第一代的占用的内存,此时由于远小于2M,所以只检查第0代的对象。基于假设----新创建的对象生存期短,第0代会包含大量垃圾,所以对第0代进行垃圾回收可以回收较多的内存,垃圾回收器会忽略第一代的对象,从而加快垃圾回收速度。经过一次垃圾回收后,堆内如下图所示:

我们可以看到,幸存下来的0代变成了1代,由于垃圾回收器没有进行1代的检查,所以B占用的内存并没有被回收,此时0代没有任何对象。假如堆中又增加了L-O,然后G,L,M成为垃圾:

假如分配P导致第0代超出预算,垃圾回收启动。由于1代中对象占用的内存小于2MB,此时垃圾回收器仍然只回收0代。回收后如下图:

如此下去,1代会慢慢的增长,如果其内存占据2MB,此时对堆中分配对象P-S,使第0代超出其预算,如下图:

当对堆内分配对象T时,由于0代已满,对其进行垃圾回收,此时垃圾回收器发现1代超过了2MB内存,所以此次对一代和0代同时进行垃圾检查。两代都回收后,堆内情况如下:

像前面相同,0代提升到1代,1代提升到2代,此时0代又空出来了,再次接受新的对象。
CLR的托管堆只支持三代:0、1、2。CLR初始化时,会为每一代选择预算,大约依次为256KB,2MB,10MB,预算越大,垃圾回收频率越低,
CLR中的垃圾回收机制的更多相关文章
- 浅谈Chrome V8引擎中的垃圾回收机制
垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...
- 浅谈V8引擎中的垃圾回收机制
最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...
- Python中的垃圾回收机制
Python的垃圾回收机制 引子: 我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,而变量名是访问到变量值的唯一方式,所以 ...
- Javascript中的垃圾回收机制
Javascript 中的内存管理 译自MDN,Memory Management 简介 在底层语言中,比如C,有专门的内存管理机制,比如malloc() 和 free().而Javascript是有 ...
- Java中的垃圾回收机制
1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...
- JavaScript中的垃圾回收机制与内存泄露
什么是内存泄露? 任何编程语言,在运行时都需要使用到内存,比如在一个函数中, var arr = [1, 2, 3, 4, 5]; 这么一个数组,就需要内存. 但是,在使用了这些内存之后, 如果后面他 ...
- JAVA中的垃圾回收机制以及其在android开发中的作用
http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...
- Java中的垃圾回收机制&内存管理&内存泄漏
1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所 ...
- java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是
答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...
随机推荐
- [ZZ] python 语言技巧
http://sahandsaba.com/thirty-python-language-features-and-tricks-you-may-not-know.html 感谢原作者 30 Pyt ...
- JQuery之初探
软考过后又进入了紧张的B/S学习阶段,因为自己的进度比較慢,所以更要加进学习.如今就来总结下JQuery的一些基础知识: JQuery定义 jQuery是一套跨浏览器的JavaScript库,简化HT ...
- 【LeetCode】 String中的最长回文
java 普通版: 1.正序遍历数组,取得子字符串的首字母. 2.倒序遍历数组,取的子字符串的尾字母. (这样仅仅要在子循环中第一个出现回文,那么该回文肯定是本次循环的最长的回文) 3.新增数据结构, ...
- iOS开发必看的博客汇总
OneV's Den http://onevcat.com/ 沉船家园 http://beyondvincent.com/ NSHipster http://nshipster.cn/ Limboy ...
- Android 阅读Manifest在文件Application 在与其他节点meta-data定义自己的数据
介绍 Android提供meta-date使用键值在实现自己的自定义配置的形式. 通常用作信道标识.它可以用在<application>,<activity>,<acti ...
- Util
Util最新代码更新说明 离上一篇又过去了一个月,时间比较紧,后续估计会更紧,所以这次将放出更多公共操作类及配套的CodeSmith模板,本篇将简要介绍新放出的重要功能,供有兴趣的同学参考. 重要 ...
- maven_修改setting ,改为自己私服或者OSC开源中国 [为解决sqlite-jdbc 在中央仓库找不到]
因为项目要使用到sqlite ,虽然有现成的jar,但是考虑的项目的易用统一管理,决定还是用maven 结果纠结了半天 sqlite-jdbc 在maven默认的仓库根本找不着,于是乎修改 setti ...
- 七牛云存储C#例用小例子 C#笔记
最近有需求要把网站的图片传到云存储上去.于是就找到了七牛.看上面的SDK...看了才发现里面注释很少.当时看的头大.在网上搜一下,基本上没有好的例子.给初学者带来很大的不便!不过最后还是做出来了.在这 ...
- Ronco创投原则 - 硅谷创业教父Paul Graham文摘
(天地会珠海分舵注:虽然已经尽力翻译,还是担心会和大师的原意有偏差,所以这里保留英文原文给大家作参考) Ronco创投原则 No one, VC or angel, has invested in m ...
- webkit的几个属性
-webkit-text-size-adjust 1.当样式表里font-size<12px时,中文版chrome浏览器里字体显示仍为12px,这时可以用 html{-webkit-text-s ...