.Net之垃圾回收算法
垃圾回收器检测托管堆中是否有应用程序不在使用的任何对象,如果一次垃圾回收之后,堆栈没有可用的内存,new操作符将会抛出OutOfMemoryException(内存溢出)。
每一个应用程序都包含一组根,每个根都是一个存储位置,。其中包含指向引用类型对象的一个指针。该指针要么引用托管堆中的一个对象,要么为null。类型中定义的任何一个静态字段都被认为是一个根,值类型变量永远必备认为是根。
垃圾回收器可以沿着线程的调用栈上运行,检测每一个方法内部表来确定所有调用方法的根。垃圾回收器的第一个阶段是所谓的标记阶段,在这个阶段,垃圾回收器沿着线程栈上行以检查所有根。如果发现一个根引用了一个对象,就在对象的“同步快索引字段”上开启一位----------对象就是这样标记的。垃圾回收器以递归的方式遍历所有可达对象。标记好根和它的字段引用的对象后,垃圾回收器检查下一个根,继续标记对象,如果垃圾回收器试图标记一个先前标记过的对象,就会停止沿着这个路径走下去。这个行为有2个目的。首先,垃圾回收器不会多遍历一组对象,索引性能显著增强,其次,如果存在对象的循环链表,可以避免陷入无限循环。
检查好所有根之后,堆中将包含一组已标记的和未标记的对象。未标记的被认为是垃圾。现在垃圾回收器开始第二阶段,即压缩阶段,在这个阶段中,垃圾回收器线性的遍历堆,以寻找为标记的对象的连续内存块。如果发现的内存块比较小,垃圾回收器会忽略他们。如果发现大的,可用的连续内存块,垃圾回收器会把非垃圾的对象移动到这里以压缩堆。
移动内存中的对象后,包含“指向这些数据对象的指针”的变量和CPU寄存器都回变的无效。所以垃圾回收器必须从新访问应用程序的所有根,并修改他们指向对象的新内存位置。堆内存压缩后,托管对的NextObjPtr指针将指向紧接在最后一个非垃圾对象之后的位置。垃圾回收器会造成显著的性能损失。这是使用托管堆的主要缺点。但是这只有垃圾回收在第0代的时候才发生。 什么时候导致Finalize方法被调用?
① 第0代满 ②代码显示的调用System.GC的静态方法Collect ③Windows报告内存不足 ④CLR卸载AppDomain,被卸载时CLR认为AppDomain中不再存在任何根,因此会对所有代的对象执行垃圾回收。⑤CLR关闭 一个进程正常终止是,CLR就会关闭,在关闭进程中不存在任何根,因此会调用托管堆中的多有对象的Finalize方法。注意:CLR此时不回尝试压缩或释放内存,因为整个进程都要终止,将由Windows负责回收进程所有内存。
Finalize的缺点:它的调用时间是不能保证的,它不是公共方法,所以类的用户不能显示的调用它。
.Net之垃圾回收算法的更多相关文章
- JAVA虚拟机垃圾回收算法原理
除了释放不再被引用的对象外,垃圾收集器还要处理堆碎块.新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动的对象之间.请求分配新对象时可能不得不增大堆空间的大小,虽然可以使用的总空 ...
- JVM调优-Jva中基本垃圾回收算法
从不同的的角度去划分垃圾回收算法. 按照基本回收策略分 引用计数(Reference Counting) 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回 ...
- 深入理解java虚拟机【垃圾回收算法】
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- 记录JVM垃圾回收算法
垃圾回收算法可以分为三类,都基于标记-清除(复制)算法: Serial算法(单线程) 并行算法 并发算法 JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代 ...
- JVM 垃圾回收算法
在说垃圾回收算法之前,先谈谈JVM怎样确定哪些对象是“垃圾”. 1.引用计数器算法: 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当 ...
- JVM学习总结二——垃圾回收算法
昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原 ...
- JVM垃圾回收机制总结(4) :新一代的垃圾回收算法
垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...
- (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- C/C++中几种经典的垃圾回收算法
1.引用计数算法 引用计数(Reference Counting)算法是每个对象计算指向它的指针的数量,当有一个指针指向自己时计数值加1:当删除一个指向自己的指针时,计数值减1,如果计数值减为0,说明 ...
- (5)jvm垃圾回收器相关垃圾回收算法
引用计数法[原理]--->引用计数器是经典的也是最古老的垃圾收集防范.--->实现原理:对于对象A,只要有任何一个对象引用A,则计数器加1.当引用失效时,计数器减1.只要对象A的计数器值为 ...
随机推荐
- C#中equals方法和==的区别
Msdn中对equals方法的解释是:确定指定的对象是否等于当前对象. Equals方法是比较对象的内容,而==则是比较整个对象是否相等. Equals方法判断的是堆中的值,而==则判断的是堆栈中的值 ...
- win7+IE11 中开发工具报错occurredJSLugin.3005解决办法
系统环境 win7+IE11 报错描述: Exception in window.onload: Error: An error has ocurredJSPlugin.3005 Stack Trac ...
- MySql优化方案
mysql优化方案总结 u Mysql数据库的优化技术 对mysql优化时一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索 ...
- PowerDesigner中NAME和COMMENT的互相转换,需要执行语句
原文: http://www.cnblogs.com/xnxylf/p/3288718.html 由于PDM 的表中 Name 会默认=Code 所以很不方便, 所以需要将 StereoType 显示 ...
- 验证角谷猜想(hd1279)
验证角谷猜想 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- ZigBee 协议规范
ZigBee协议栈体系结构由应用层.应用汇聚层. 网络层.数据链路层和物理层组成,如下图所示: 图1 ZigBee 协议栈体系的层次结构 应用层定义了各种类型的应用业务,是协议栈的最 ...
- inet address example(socket)
package com.opensource.socket; import java.net.Inet4Address; import java.net.Inet6Address; import ja ...
- Chapter 13. Miscellaneous PerlTk Methods PerlTk 方法杂项:
Chapter 13. Miscellaneous PerlTk Methods PerlTk 方法杂项: 到目前为止,这本书的大部分章节 集中在特定的几个部件, 这个章节覆盖了方法和子程序 可以被任 ...
- 必学100个常用linux命令大全
1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部 2 ...
- Linux进程间通信——使用流套接字
前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...