内存分配

  • 计算对象大小。
  • 添加对象指针和同步索引块。
  • 从内存指针处开始,分配对象内存。
  • 问题:内存不能无限制增长。

垃圾回收

  • 从应用程序实例出发,标记所有的引用对象。
  • 将标记对象移动到低地址端,修正实例引用地址与内存指针。
  • 问题:全内存移动对象,垃圾回收性能不高。

分代回收

  • 将对象分代(0、1、2),对低代对象进行垃圾回收,幸存对象升级为高代对象。
  • 低代对象垃圾回收也无法满足时高代对象进行垃圾回收,若2代垃圾回收后仍不满足,抛出异常。
  • 问题:托管资源由CLR自动实现垃圾回收,但非托管资源无法处理。

终结器机制

  • 非托管资源分配内存时,若对象在析构函数中编写资源释放代码,编译器根据析构函数自动生成Object.Finalize()方法,将该对象指针加入到终结列表。
  • 垃圾回收时,若终结列表中存在该对象指针则移除,并将对象实例添加到待终结对象列表,否则触发垃圾回收。
  • CLR启用高优先级后台线程,遍历执行待终结对象列表中的Finalize方法,并从队列中移除对象实例。
  • 问题:非托管资源在0代无法回收,可能存在升代情况,无法及时释放资源。

IDisposable实现

  • 非托管资源对象继承IDisposable接口,实现Dispose()方法提供资源释放功能。
  • 使用者调用Dispose()方法及时回收非托管资源,并通知CLR不必再回收该非托管资源。
  • 在析构函数中调用Dispose()方法作为保护机制,防止因使用者未调用Dispose()方法,保证非托管资源能够最终释放。

GC触发时机

  • 0代超过预算时。
  • 显式调用System.GC.Collect()。
  • Windows报告低内存。
  • AppDomain正在被卸载。
  • CLR正常关闭时。

.NET GC简单理解的更多相关文章

  1. JS闭包的简单理解。优缺点以及垃圾回收机制

    闭包是什么? ·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立:所以都可以访问全局变量 ·为了解决函数外部无法访问函数内局部 ...

  2. git的简单理解及基础操作命令

    前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...

  3. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  4. [转]简单理解Socket

    简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html  题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...

  5. Js 职责链模式 简单理解

    js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...

  6. Deep learning:四十六(DropConnect简单理解)

    和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...

  7. Deep learning:四十二(Denoise Autoencoder简单理解)

    前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...

  8. 简单理解dropout

    dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...

  9. 我们为之奋斗过的C#-----C#的一个简单理解

    我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...

随机推荐

  1. GitHub 上最热的10款国产开源软件

    衡量一个开源产品好不好,看看产品在 GitHub 的 Star 数量就知道了.由此可见,GitHub 已经沦落为开源产品的“大众点评”了.一个开源产品希望快速的被开发者知道.快速的获取反馈,放到 Gi ...

  2. libusb_submit_transfer 异步通信libusb

    https://bbs.csdn.net/topics/391012708?list=lz

  3. iOS View的一些操作定义为宏

    #define ViewOf(__View__,__TAG__) [__View__ viewWithTag:__TAG__]#define LabelOf(__View__,__TAG__) ((U ...

  4. java虚拟机的基本结构如图

    1 java虚拟机的基本结构如图: 1)类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字 ...

  5. 手摸手教你使用vue-cli脚手架-详细步骤图文解析[vue入门]

    写在前面: 使用 vue-cli 可以快速创建 vue 项目,vue-cli很好用,但是在最初搭建环境安装vue-cli及相关内容的时候,对一些人来说是很头疼的一件事情,本人在搭建vue-cli的项目 ...

  6. mysql 模拟oracle中的序列

    因业务需要,把oracle 数据据转成mysql,同时oracle中程序本来一直在用 序列, mysql中没有,所以需要在mysql中新建一个表进行模拟, CREATE TABLE `sequence ...

  7. 详解 @MapperScan 注解和 @Mapper 注解

    实际上,这是一个非常简单的问题.我并没有一口回绝他,让他去百度.因为,新人都会经历这个过程.好不容易,问你一次,你直接让他百度,会打击到他的.而且,别人会觉得你摆架子. @Mapper 这个注解的定义 ...

  8. qt一些函数

    sleep(n);   休息ns msleep(1000);   休息1000毫秒 usleep(1000000);  //休息n微妙

  9. 【agc004e】Salvage Robots

    题目大意 一个n*m的矩阵,矩阵内有一个出口和若干个机器人,每一步操作可以使所有的机器人向任意方向移动一格,如果机器人出了边界就爆炸.求最多可以让多少个机器人走到出口. 解题思路 发现,移动所有机器人 ...

  10. js拖拽文件夹上传

    由于项目需要上传文件到服务器,于是便在文件上传的基础上增加了拖拽上传.拖拽上传当然属于文件上传的一部分,只不过在文件上传的基础上增加了拖拽的界面,主要在于前台的交互, 从拖拽的文件中获取文件列表然后调 ...