垃圾回收器检测托管堆中是否有应用程序不在使用的任何对象,如果一次垃圾回收之后,堆栈没有可用的内存,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. 使用react-native做一个简单的应用-01项目介绍

    学习react-native也有一个月的时间了.当学习了关于react-native的基础知识之后,打算自己去仿一个应用去练手.于是花了10天左右的时间,这个小应用的基本功能也实现的差不多了. 在展示 ...

  2. 2014年2月5日 Oracle ORACLE的工作机制[转]

      网上看到一篇描写ORACLE工作机制的文章,觉得很不错!特摘录了下来.   ORACLE的工作机制-1 (by xyf_tck) 我们从一个用户请求开始讲,ORACLE的简要的工作机制是怎样的,首 ...

  3. B - A + B Again

    Description There must be many A + B problems in our HDOJ , now a new one is coming.         Give yo ...

  4. Java虚拟机:JVM中的Stack和Heap

    简单的了解一下JVM中的栈和堆 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和 ...

  5. HTML5 drawImage 使用问题

    使用Image遇到的问题: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  6. php 数组 array_values () array_key()

    <?php // array_unique($array) 去除重复 // array_unshif()向数组的顶部追加函数 // array_shif($a,"ss")向数 ...

  7. python编码格式

    python编码总结: 1).首先python有两种格式的字符串,str和unicode,其中unicode相当于字节码那样,可以跨平台使用. str转化为unicode可以通过unicode(),u ...

  8. python核心编程-第五章-个人笔记

    1.用del删除对对象的引用 >>> a = 123 >>> a 123 >>> del a >>> a Traceback ( ...

  9. 利用Azure backup备份和恢复Azure虚拟机(1)

    中国区Azure最近发布了关于使用Azure Backup来备份VM服务,于3月1日正式上线,该功能对于需要对关键工作负载进行备份的用户来讲,极大的降低了操作复杂度.以前我们所使用Powershell ...

  10. Linux上配置Nginx+PHP5(FastCGI)

    原为地址:http://www.laruence.com/2009/07/28/1030.html Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,以事件驱动的方式编写,所以有非常好的性能,同时 ...