对.NET的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(垃圾回收)的理解都存在错误认识相关推荐
- 不要再问我“Java GC垃圾回收机制”了
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底 ...
- jvm gc垃圾回收机制和参数说明amp;amp;Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情)
jvm gc(垃圾回收机制) Java JVM 垃圾回收(GC 在什么时候,对什么东西,做了什么事情) 前言:(先大概了解一下整个过程) 作者:知乎用户 链接:https://www.zhihu.c ...
- golang GC垃圾回收机制
** golang GC垃圾回收 ** 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行. Go ...
- java gc 有钱人_小猿圈java之GC垃圾回收机制
垃圾回收机制是提高性能的重要机制,所以不管学什么语言也好,垃圾回收机制都是有的,也是很重要的,小猿圈这章详解一下java的GC垃圾回收机制,需要用的或者感兴趣的朋友们,可以跟着小编学习一下. 一.GC ...
- java如何关闭gc,GC垃圾回收机制,
GC垃圾回收机制, 个人理解: 因为在使用JAVA创建一个类或者对象后,难免会存在以后不使用的情况,为了减少其继续再占用内存,必须建立一套清理垃圾的机制,但是怎么判断什么样的才算是不使用的垃圾呢,这里 ...
- 精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)
前提介绍 很多小伙伴,都跟我反馈,说自己总是对JVM这一块的学习和认识不够扎实也不够成熟,因为JVM的一些特性以及运作机制总是混淆以及不确定,导致面试和工作实战中出现了很多的纰漏和短板,解决广大小伙伴 ...
- Day125.JVM:栈、堆、GC 垃圾回收机制
目录 一.JVM 体系结构概述 ★★★ 栈 (stack) 堆 (Heap) 新生区.养老区.永久代(元空间) 堆参数调优 OOM 问题定位解决 二.GC 垃圾回收 1.垃圾判定 2.垃圾回收算法 ★ ...
- idea本地跑如何看gc日志_不可思议,竟然还有人不会查看GC垃圾回收日志?
日志的重要性,不需要过多强调了.通过日志,我们可以发现程序可能有内存(泄露)问题.本文从案例出发,具体介绍这些日志信息,以期帮助大家更好地了解垃圾回收的运行情况. 还是先上图,看看本文的主要内容: 我 ...
- java垃圾回收机制_乐字节Java|GC垃圾回收机制、package和import语句
本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...
最新文章
- 烦死调参数-想设计一个自动调参机制
- windows下的eclipse运行hdfs程序时报错 (null) entry in command string: null chmod 0644【笔记自用】
- ABAP CHECKBOX 和LISTBOX使用指南
- gbdt子采样参数的理解
- osgi框架和spring区别_最新100道大厂高频spring面试题附答案
- Django从理论到实战(part27)--ORM模型的增删改查操作
- 行为类模式(二):命令(Command)
- CodeForces-999D Equalize the Remainders (贪心+神奇的STL)
- 【iOS】使用storyboard界面跳转报错:unrecognized selector sent to instance 0x7
- 2018上IEC计算机高级语言(C)作业 第0次作业
- H.265 SAO技术
- matplotlib绘制图像设置中文宋体,英文新罗马,字体大小7.5,坐标轴刻度线内侧
- 软件项目管理学习(一)
- 网易数帆王佰平:我的 Envoy Maintainer 之路
- 输入直角三角形的两个直角边的长度 a、b,求斜边 c 的长度。
- 梅科尔工作室-李庆浩 深度学习-KNN算法
- 2012年中国285个地级市名单、各地级市对应车牌号代码
- Educoder头歌-Linux vi/vim编辑器
- 小伙伴们-GO-带你揭开Linux的神秘面纱
- python是跨平台的 以及 py、pyc、pyo