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是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为“无意识的对象保持”.如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处 ...
随机推荐
- 左右c++与java中国的垃圾问题的分析与解决
左右c++与java中国的垃圾问题的分析与解决 DionysosLai(906391500@qq.com) 2014/8/1 问题分析: 之所以会出现中文乱码问题,归根结底在于中文的编码与英文的编码 ...
- Git 命令速查表
Git 命令速查表 1.常用的Git命令 命令 简要说明 git add 添加至暂存区 git add-interactive 交互式添加 git apply 应用补丁 git am 应用邮件格式补丁 ...
- C# 线程知识--使用Task执行异步操作
在C#4.0之前需要执行一个复杂的异步操作时,只能使用CLR线程池技术来执行一个任务.线程池执行异步任务时,不知道任务何时完成,以及任务的在任务完成后不能获取到返回值.但是在C#4.0中引人了一个的任 ...
- ABP分层架构
ABP分层架构 基于DDD的现代ASP.NET开发框架--ABP系列之3.ABP分层架构 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP ...
- XCL-Charts绘画面积图(AreaChart) 案件1
样本区域地图,发现区域图的时候把做向上注视位置图更具优势的管理. 在改变. 区域图网格和轴是不一样的处理与其它图, 它是用来表示其影响范围的覆盖范围,车桥无段伸出.在这里下处理. 代码: /** * ...
- 2440裸 Delay(); 和 while(!(rUTRSTAT0 & 0x2)); 问题
前两天写RTC中断 使用串行输出 它发现,该方案将while(!(rUTRSTAT0 & 0x2));走不出的情况.的 解决方法: main函数添加: U32 mpll_val = 0,con ...
- .net EF 事物 订单流水号的生成 (一)
首先需要 添加 System.Transactions 程序集 数据表: create table SalesOrder ( ID ,) primary key not null, OrderNo ) ...
- BS导出csv文件的通用方法(.net)
最近把以前项目里用的导出文件的功能提取成了dll,通过读取Attribute来得到要导出的表头(没有支持多语言),使用时只要组织好要导出的数据,调用方法就好了,希望对大家有用. 使用时只需引用下载包里 ...
- REDGATE SQL TEST的使用
原文:REDGATE SQL TEST的使用 REDGATE SQL TEST的使用 SQL TEST下载和破解可以参考这篇文章:http://www.cnblogs.com/VAllen/archi ...
- 在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)支持。
原文:在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)支持. WAMPServer可以让开发者在Windows系统下快速搭建WAMP环境,它支持多版本的Apach ...