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是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...
随机推荐
- 【 D3.js 入门系列 --- 9.1 】 生产饼图
我个人的博客: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处.谢谢. 这一节用 Layout 做一个饼状图.第9节中说过, Layout ...
- css+html菜单适应性学习的宽度
本文就是利用css和html自适应于文本菜单的长度. 后效果图实现,例如下列: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvajkwMzgyOTE4Mg= ...
- 不能交换到解决jenkins用户的问题
su - jenkins始终有效,今centos无效,因为 /etc/password在文档/bin/bash是yum当安装到/bin/false. 之后可以改变. ubuntu安装包和yum安装包的 ...
- 一些有用的javascript实例分析(二)
原文:一些有用的javascript实例分析(二) 5 求出数组中所有数字的和 window.onload = function () { var oBtn = document.getElement ...
- UVa 10223 - How many nodes ?
称号:气你一个整数n,问:多少节点可以产生n不同的二叉树. 分析:数论,卡特兰数.根据定义,你可以. 说明:请参阅http://blog.csdn.net/mobius_strip/article/d ...
- 离github在导入dubbo工程
dubbo移动到github目前已经有一些时间,我们可能根本不习惯使用github.因此,我们仍然使用以前的版本号. 由于某些原因.阿里下载前关闭.在这里给大家提供一个私有地址: 链接:http:// ...
- DirectX11 学习笔记3 - 创建一个立方体 和 轴
该方案将在进一步的程序 面向对象. 独立的模型类.更像是一个框架. 其中以超过遇到了一个非常有趣的问题,.获得一晚.我读了好几遍,以找到其他的列子.必须放在某些功能Render里面实时更新,而不是仅仅 ...
- PHP连接Access数据库代码
使用php的odbc函数,不创建数据源. $connstr="DRIVER=Microsoft Access Driver (*.mdb);DBQ=".realpath(" ...
- HDU 3523 Image copy detection(KM最大匹配)
HDU 3523 Image copy detection 题目链接 题意:这题事实上题意读懂就简单了,说白了就是1-n放到1-n列,每列的值为每列上数字和该数字的差的绝对值,然后求总和最小 思路:就 ...
- jquery 直接调用 wcf,面向服务的SOA架构 ( 第三天)
所谓万事 具备,只欠东风了!! 接下来就是 wcf 的调用, 首先 在客户端下,随便 写一个 html页面,然后写入如下方法: <script src="scripts/jquery. ...