垃圾回收器帮我们处理了内存中不在使用的对象,提高了机器的性能,让开发人员轻松了很多。

你真的了解垃圾回收吗?

或许你知道垃圾回收,听说过是通过标记回收,可是怎么标记回收呢就不是很清楚了,好吧,如果不清楚就继续往下看。如果你是大神对这块了如执掌,请直接跳过,欢迎来提不同的意见。

1、我们先来聊一下内存分配:

代码中声明变量是需要向内存申请地址的,内存呢又分托管堆和栈,我们今天主要聊的就是托管堆内存

啥事托管堆内存呢?想必各位也心中知道,不知道的自行百度谷歌去。

写代码中凡是需要使用new声明的变量都是引用类型变量,使用的都是托管堆内存地址,那声明了一个对象,需要分配多大的控件呢?

1.1、这个时候就需要计算类型的字段需要的字节数了

1.2、引用类型对象开销的字节数还需要(类型对象指针和同步索引块)

  在32位应用中,这多出来的两个字段各需32位字节地址空间,所以每个对象需要多占用8个字节的地址控件

  在64位应用中,这多出来的两个字段各需64位字节地址空间,所以每个对象需要多占用16个字节的地址控件

1.3、内存申请后,CLR会检查保留区是否能够提供分配对象所需的字节数,使用new 声明的对象会向托管堆请求地址分配,并返回对象地址,NextObjPtr指针会加上对象占据的字节数,得到一个新值

2、垃圾回收-Go Go Go

垃圾回收的基本逻辑:垃圾回收器会检查托管堆中是否又应用程序不再使用的任何对象,如果有,它们使用的内存就可以回收了。

回收之前的托管堆如下:

下面我们来聊一下标记回收的整个过程:

2.1、首先,应用有一组根(root)每个根都是一个存储位置,其中包含指向引用类型对象的一个指针,指针要么引用托管堆中的一个对象,要么为null

  例如:类型中定义的任何静态字段被认为是一个根

       任何方法参数或局部变量也被认为是一个根,只有引用类型的变量才被认为是一个根,值类型不能被认为是根。

2.2、垃圾回收的第一阶段,标记阶段:

  这时,垃圾回收器会沿着线程栈上行以检查所有根,如果发现一个根引用了一个对象,就在对象 “同步索引块”上开启一位---标记,

  以递归的方式遍历所有可达的对象。如果垃圾回收器试图标记一个先前标记过的对象,就会停止沿这个路径走下去。

    这个行为有两个目的:

      1、垃圾回收器不会多次遍历一个对象,所以性能得到显著增强

      2、如果对象存在循环链表,可以避免无线循环。

   检查完所有的根之后,堆中将包含一组已标记和未标记的对象,已标记的对象是代码可达的对象,而未标记的对象是不可达的,不可达的对象被认为是垃圾,它们占用的内存是可以被回收的

垃圾回收之后的托管堆如下:

2.3、垃圾回收的第二阶段,压缩阶段:

  这个时候该回收内存空间已经都回收了,空出来的内存可能是前头一块,中间一块,后边又一块。

  垃圾回收器线性遍历堆,以寻找未标记对象的连续内存块,如果发现内存块比较小,则忽略,如果发现大的,可用的连续内存块,垃圾回收器会把非垃圾的对象移动到这里以压缩堆。

参考:CLR Via C#(第三版)

  

.net 垃圾回收的更多相关文章

  1. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  2. 修改session垃圾回收几率

    <?php //修改session垃圾回收几率 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','2'); ...

  3. .NET面试题系列[5] - 垃圾回收:概念与策略

    面试出现频率:经常出现,但通常不会问的十分深入.通常来说,看完我这篇文章就足够应付面试了.面试时主要考察垃圾回收的基本概念,标记-压缩算法,以及对于微软的垃圾回收模板的理解.知道什么时候需要继承IDi ...

  4. .net垃圾回收机制编程调试试验

    1. 什么是CLR GC? 它是一个基于引用跟踪和代的垃圾回收器. 从本质上,它为系统中所有活跃对象都实现了一种引用跟踪模式,如果一个对象没有任何引用指向它,那么这个对象就被认为是垃圾对象,并且可以被 ...

  5. Java垃圾回收

    垃圾收集算法 引用计数 堆中的每个对象都有一个引用计数,当对象被引用时引用计数加1,当对象的引用被重新赋值或超出有效区域时引用计数减1,当一个对象被回收后,它所引用的对象的引用计算减1.当一个对象的引 ...

  6. JavaScript具有自动垃圾回收机制

    JavaScript具有自动垃圾回收机制 原理: 找出那些不再继续使用的变量,然后释放其占用的内存.   正常的生命周期:     局部变量指在函数执行的过程中存在.而在这个过程中,会为局部变量在栈或 ...

  7. .NET 垃圾回收与内存泄漏

    > 前言相信大家一定听过,看过甚至遇到过内存泄漏.在 .NET 平台也一定知道有垃圾回收器,它可以让开发人员不必担心内存的释放问题,因为它会自定管理内存.但是在 .NET 平台下进行编程,绝对不 ...

  8. JavaScript 垃圾回收

    在公司经常会听到大牛们讨论时说道内存泄露神马的,每每都惊羡不已,最近精力主要用在了Web 开发上,读了一下<JavaScript高级程序设计>(书名很唬人,实际作者写的特别好,由浅入深)了 ...

  9. C#技术漫谈之垃圾回收机制(GC)

    GC的前世与今生 虽然本文是以.NET作为目标来讲述GC,但是GC的概念并非才诞生不久.早在1958年,由鼎鼎大名的图林奖得主John McCarthy所实现的Lisp语言就已经提供了GC的功能,这是 ...

  10. Java的垃圾回收和内存分配策略

    本文是<深入理解Java虚拟机 JVM高级特性与最佳实践>的读书笔记 在介绍Java的垃圾回收方法之前,我们先来了解一下Java虚拟机在执行Java程序的过程中把它管理的内存划分为若干个不 ...

随机推荐

  1. ubutu 12.04

    1.[系统设置]->[外观]->[行为]->[自动隐藏启动器],隐藏左侧边栏后,可以按快捷键[CTRL+a]弹出侧边栏. 2.QtCreator调试,提示[ptrace不允许的操作] ...

  2. libfastcommon总结(二)从文件中加载配置信息

    头文件为ini_file_reader.h 主要接口 IniContext iniContext;//定义配置文件信息 iniLoadFromFile();//加载文件为结构化配置信息    iniG ...

  3. 【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题

    [练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果 ...

  4. 一般人不知道的Flask框架SQLAlchemy的那些事

    目录 SQLAlchemy 1.介绍 2.简单使用(能创建表,删除表,不能修改表) 3.一对多关系 4.多对多关系 5.操作数据表 6.基于scoped_session实现线程安全 7.基本增删查改 ...

  5. 等价类计数:Burnside引理 & Polya定理

    提示: 本文并非严谨的数学分析,有很多地方是自己瞎口胡的,仅供参考.有错误请不吝指出 :p 1. 群 1.1 群的概念 群 \((S,\circ)\) 是一个元素集合 \(S\) 和一种二元运算 $ ...

  6. Journal of Proteome Research | SAAVpedia: identification, functional annotation, and retrieval of single amino acid variants for proteogenomic interpretation | SAAV的识别、功能注释和检索 | (解读人:徐洪凯)

    文献名:SAAVpedia: identification, functional annotation, and retrieval of single amino acid variants fo ...

  7. CSS实现垂直居中布局

    垂直居中 每日更新前端基础,如果觉得不错,点个star吧

  8. 曹工说Spring Boot源码(25)-- Spring注解扫描的瑞士军刀,ASM + Java Instrumentation,顺便提提Jar包破解

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  9. Django CBV加装饰器、Django中间件、auth模块

    一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...

  10. CBV和APIView源码分析

    CBV源码分析 查看源码的方式,先查看自身,没有去找父类,父类没有就去找父父类... 自己定义的类 class Author(View): def get(self,request): back_di ...