对.NET的GC(垃圾回收)的理解都存在错误。GC其实是相当复杂的系统,虽然95%的情况下我们并不需要考虑它,但仍有5%的情况我们不得不接触GC体系来解决问题。比如这个问题:

void Func()
{
  A a = new A();
  B b = new B();
  a.RefToB = b;
  b.RefToA = a;
}

那么a和b会不会被GC回收?好几个人都答错。如果你按照COM的模式去思考GC,那就完全错误了。每次我问“什么情况下,对象会被GC回收?”,他们都能回答上来“当程序里没有对对象的引用时”。但是错了,为什么?如果你还没明白,就再看看上面这段代码。

GC管理对象不是用的COM的引用计数模式。事实上最初微软确实想用引用计数方式实现GC,这样的一个优势就是对象的析构时机是确定的,当引用计数为0时,对象会被析构,之后也不会再有任何代码能够再访问该对象,这是很理想的情况。但经过反复实验,这种方法被抛弃了。一个原因就是如上的例子,会导致对象无法释放。另一个重要原因就是应用计数的额外开销对高性能程序不可接受。尤其是在多线程情况下,因为.NET使用自由线程模型,多个线程可能同时访问一个对象,每一个引用计数的增减操作都不得不做线程同步。

.NET采用的GC模式是分代GC(Generational GC),堆空间按对象的生存期长短分成4代。新分配的对象在第0代,按地址顺序分配,当第0代的空间(约几百K)用光时,将程序里能引用到的对象移动到第1代,那么剩下的就是垃圾,第0代空间便可以重新用于分配。同理,第1、2代也按同样的逻辑运行,那么第3代里的对象将都是生存期很长的对象。由此可以推出如下几点:
1)对象的分配时间开销远小于C++的堆分配,但回收时间开销大于分配时间开销。
2)不会出现C++里的堆碎片过多的问题,有利于程序长时间运行。
3)循环引用的对象能够被正确回收。

那么再回答开始的问题,“什么情况下,对象会被GC回收?”正确答案是“当程序里没有对对象的活引用(Alive reference)时。”

转载于:https://www.cnblogs.com/jackxia/archive/2009/03/11/1409057.html

对.NET的GC(垃圾回收)的理解都存在错误认识相关推荐

  1. 不要再问我“Java GC垃圾回收机制”了

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底 ...

  2. jvm gc垃圾回收机制和参数说明amp;amp;Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情)

    jvm gc(垃圾回收机制) Java JVM  垃圾回收(GC 在什么时候,对什么东西,做了什么事情) 前言:(先大概了解一下整个过程) 作者:知乎用户 链接:https://www.zhihu.c ...

  3. golang GC垃圾回收机制

    ** golang GC垃圾回收 ** 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行. Go ...

  4. java gc 有钱人_小猿圈java之GC垃圾回收机制

    垃圾回收机制是提高性能的重要机制,所以不管学什么语言也好,垃圾回收机制都是有的,也是很重要的,小猿圈这章详解一下java的GC垃圾回收机制,需要用的或者感兴趣的朋友们,可以跟着小编学习一下. 一.GC ...

  5. java如何关闭gc,GC垃圾回收机制,

    GC垃圾回收机制, 个人理解: 因为在使用JAVA创建一个类或者对象后,难免会存在以后不使用的情况,为了减少其继续再占用内存,必须建立一套清理垃圾的机制,但是怎么判断什么样的才算是不使用的垃圾呢,这里 ...

  6. 精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)

    前提介绍 很多小伙伴,都跟我反馈,说自己总是对JVM这一块的学习和认识不够扎实也不够成熟,因为JVM的一些特性以及运作机制总是混淆以及不确定,导致面试和工作实战中出现了很多的纰漏和短板,解决广大小伙伴 ...

  7. Day125.JVM:栈、堆、GC 垃圾回收机制

    目录 一.JVM 体系结构概述 ★★★ 栈 (stack) 堆 (Heap) 新生区.养老区.永久代(元空间) 堆参数调优 OOM 问题定位解决 二.GC 垃圾回收 1.垃圾判定 2.垃圾回收算法 ★ ...

  8. idea本地跑如何看gc日志_不可思议,竟然还有人不会查看GC垃圾回收日志?

    日志的重要性,不需要过多强调了.通过日志,我们可以发现程序可能有内存(泄露)问题.本文从案例出发,具体介绍这些日志信息,以期帮助大家更好地了解垃圾回收的运行情况. 还是先上图,看看本文的主要内容: 我 ...

  9. java垃圾回收机制_乐字节Java|GC垃圾回收机制、package和import语句

    本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...

最新文章

  1. 烦死调参数-想设计一个自动调参机制
  2. windows下的eclipse运行hdfs程序时报错 (null) entry in command string: null chmod 0644【笔记自用】
  3. ABAP CHECKBOX 和LISTBOX使用指南
  4. gbdt子采样参数的理解
  5. osgi框架和spring区别_最新100道大厂高频spring面试题附答案
  6. Django从理论到实战(part27)--ORM模型的增删改查操作
  7. 行为类模式(二):命令(Command)
  8. CodeForces-999D Equalize the Remainders (贪心+神奇的STL)
  9. 【iOS】使用storyboard界面跳转报错:unrecognized selector sent to instance 0x7
  10. 2018上IEC计算机高级语言(C)作业 第0次作业
  11. H.265 SAO技术
  12. matplotlib绘制图像设置中文宋体,英文新罗马,字体大小7.5,坐标轴刻度线内侧
  13. 软件项目管理学习(一)
  14. 网易数帆王佰平:我的 Envoy Maintainer 之路
  15. 输入直角三角形的两个直角边的长度 a、b,求斜边 c 的长度。
  16. 梅科尔工作室-李庆浩 深度学习-KNN算法
  17. 2012年中国285个地级市名单、各地级市对应车牌号代码
  18. Educoder头歌-Linux vi/vim编辑器
  19. 小伙伴们-GO-带你揭开Linux的神秘面纱
  20. python是跨平台的 以及 py、pyc、pyo

热门文章

  1. 3月第1周网络安全报告:发现放马站点域名仍为162个
  2. 前端开发利器—FIDDLER 转
  3. PHP高效获取远程图片尺寸和大小(转)
  4. 错误913:未能找到ID为13的数据库。可能该数据库尚未激活,也可能正在转换过程中...
  5. 什么是 XDoclet?
  6. Python学习记录——持续更新
  7. python计算计算时间_用Python向孩子介绍计算思维
  8. 区块链比特币开源_开源资金:比特币,区块链和免费软件
  9. syn攻击 喝茶_如何喝茶
  10. HTML5 结构语义元素的标题h1~h6元素