垃圾回收器检测托管堆中是否有应用程序不在使用的任何对象,如果一次垃圾回收之后,堆栈没有可用的内存,new操作符将会抛出OutOfMemoryException(内存溢出)。
每一个应用程序都包含一组根,每个根都是一个存储位置,。其中包含指向引用类型对象的一个指针。该指针要么引用托管堆中的一个对象,要么为null。类型中定义的任何一个静态字段都被认为是一个根,值类型变量永远必备认为是根。
垃圾回收器可以沿着线程的调用栈上运行,检测每一个方法内部表来确定所有调用方法的根。垃圾回收器的第一个阶段是所谓的标记阶段,在这个阶段,垃圾回收器沿着线程栈上行以检查所有根。如果发现一个根引用了一个对象,就在对象的“同步快索引字段”上开启一位----------对象就是这样标记的。垃圾回收器以递归的方式遍历所有可达对象。标记好根和它的字段引用的对象后,垃圾回收器检查下一个根,继续标记对象,如果垃圾回收器试图标记一个先前标记过的对象,就会停止沿着这个路径走下去。这个行为有2个目的。首先,垃圾回收器不会多遍历一组对象,索引性能显著增强,其次,如果存在对象的循环链表,可以避免陷入无限循环。
检查好所有根之后,堆中将包含一组已标记的和未标记的对象。未标记的被认为是垃圾。现在垃圾回收器开始第二阶段,即压缩阶段,在这个阶段中,垃圾回收器线性的遍历堆,以寻找为标记的对象的连续内存块。如果发现的内存块比较小,垃圾回收器会忽略他们。如果发现大的,可用的连续内存块,垃圾回收器会把非垃圾的对象移动到这里以压缩堆。
移动内存中的对象后,包含“指向这些数据对象的指针”的变量和CPU寄存器都回变的无效。所以垃圾回收器必须从新访问应用程序的所有根,并修改他们指向对象的新内存位置。堆内存压缩后,托管对的NextObjPtr指针将指向紧接在最后一个非垃圾对象之后的位置。垃圾回收器会造成显著的性能损失。这是使用托管堆的主要缺点。但是这只有垃圾回收在第0代的时候才发生。 什么时候导致Finalize方法被调用?
① 第0代满 ②代码显示的调用System.GC的静态方法Collect ③Windows报告内存不足 ④CLR卸载AppDomain,被卸载时CLR认为AppDomain中不再存在任何根,因此会对所有代的对象执行垃圾回收。⑤CLR关闭 一个进程正常终止是,CLR就会关闭,在关闭进程中不存在任何根,因此会调用托管堆中的多有对象的Finalize方法。注意:CLR此时不回尝试压缩或释放内存,因为整个进程都要终止,将由Windows负责回收进程所有内存。
Finalize的缺点:它的调用时间是不能保证的,它不是公共方法,所以类的用户不能显示的调用它。

.Net之垃圾回收算法的更多相关文章

  1. JAVA虚拟机垃圾回收算法原理

    除了释放不再被引用的对象外,垃圾收集器还要处理堆碎块.新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动的对象之间.请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空 ...

  2. JVM调优-Jva中基本垃圾回收算法

    从不同的的角度去划分垃圾回收算法. 按照基本回收策略分 引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回 ...

  3. 深入理解java虚拟机【垃圾回收算法】

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  4. 记录JVM垃圾回收算法

    垃圾回收算法可以分为三类,都基于标记-清除(复制)算法: Serial算法(单线程) 并行算法 并发算法 JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代 ...

  5. JVM 垃圾回收算法

    在说垃圾回收算法之前,先谈谈JVM怎样确定哪些对象是“垃圾”. 1.引用计数器算法: 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当 ...

  6. JVM学习总结二——垃圾回收算法

    昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原 ...

  7. JVM垃圾回收机制总结(4) :新一代的垃圾回收算法

    垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...

  8. (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  9. C/C++中几种经典的垃圾回收算法

    1.引用计数算法 引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值加1:当删除一个指向自己的指针时,计数值减1,如果计数值减为0,说明 ...

  10. (5)jvm垃圾回收器相关垃圾回收算法

    引用计数法[原理]--->引用计数器是经典的也是最古老的垃圾收集防范.--->实现原理:对于对象A,只要有任何一个对象引用A,则计数器加1.当引用失效时,计数器减1.只要对象A的计数器值为 ...

随机推荐

  1. mvc 笔记

    @{ ViewBag.Title = "主页"; } <div> 这里就是渲染Body啦.~~不需要写神马<asp:Content />,其实因为Rende ...

  2. Mac下获取AppStore安装包文件路径-取出安装包

    问题描述:我们通过AppStore下载软件的时候想要把安装包保存下来,但是AppStore安装好之后会自动删除安装包,而且安装路径也很难找到. 解决方案: 一.打开活动监视器 二.找storedown ...

  3. 使用SignalR和SQLTableDependency跟踪数据库中记录的变动

    原文地址:查看 SqlTableDependency是一个组件用来接收数据库的通知,包含在数据表上该记录的值的Inserted.Deleted或者Update操作. 备注:原文提供示例代码下载,但是j ...

  4. css3:border-radius圆角边框详解 (变圆 图片)

    转:http://www.kuqin.com/shuoit/20141014/342620.html border-radius:50% 今天来聊聊这个border-radius属性,radius的英 ...

  5. C# 与MySQL

    1. MySQL.Data.dll       http://files.cnblogs.com/files/lwngreat/MySql.Data.rar 2.在工程中添加引用 3. 使用  Mys ...

  6. section 模块页面切换代码

    <div class="blockcode"><blockquote><!DOCTYPE html><html><head&g ...

  7. IE8下的项目在IE11下某些功能无法实现的问题

    在IE8和IE11 下获取数据的时间进行判断有些不同,也要根据浏览器的版本判断分别实现 $(".btndelete").children().children().click(fu ...

  8. 使用firefoxprofile,selenium设置firefox,初始化firefox

    1.什么是firefoxprofile 简单的来说就是个人定制,比如你设置自己访问主页,禁用加载图片这些个性化的设置,都可以保存到一个文件夹下,就是firefoxprofile,下次使用时候,加载该f ...

  9. TensorFlow深度学习笔记 文本与序列的深度模型

    Deep Models for Text and Sequence 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎st ...

  10. MYSQL 查看表定义的 4 种方法

    方法 1. show create table table_name;可以用这个看表的代码. show create table Strings; 方法 2. show full columns fr ...