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

你真的了解垃圾回收吗?

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

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. 【原创】Java并发编程系列1:大纲

    [原创]Java并发编程系列1:大纲 一个人能力当中所蕴藏的潜能,远超过自己想象以外. 为什么要学习并发编程 随着现今互联网行业的迅猛发展,其业务复杂度.并发量也在不断增加,对程序的要求变得越来越高, ...

  2. SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...

  3. Mac brew命令的使用

    mac 终端程序管理工具 能让你更快速的安装你想要的工具.而不用考虑大量的依赖. 安装brew复制下面的命令,终端执行  官网Homebrew /usr/bin/ruby -e "$(cur ...

  4. Redis缓存设计与性能优化

    Redis我们一般是用作缓存,扛并发:或者用于某些特定的业务场景,比如前面说到redis各种数据类型的使用场景以及redis的哨兵和集群模式. 这里主要整理了下redis用作缓存,存在的一些问题,以及 ...

  5. Codeforces Round #567 (Div. 2) B. Split a Number

    Split a Number time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...

  6. 李宏毅老师机器学习课程笔记_ML Lecture 0-2: Why we need to learn machine learning?

    引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...

  7. 高数解题神器:拍照上传就出答案,这个中国学霸做的AI厉害了 | Demo

    一位叫Roger的中国学霸小哥的拍照做题程序mathAI一下子火了,这个AI,堪称数学解题神器. 输入一张包含手写数学题的图片,AI就能识别出输入的数学公式,然后给出计算结果. 不仅加减乘除基本运算, ...

  8. 类加载机制之ClassLoader

    1,类加载 每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换 ...

  9. C++最简打开网页的方法

    system("explorer https://pay.747fz.com");

  10. 【mysql】索引 回表 覆盖索引 索引下推

    索引类型 索引类型分为主键索引和非主键索引.(一定要牢记,是怎么存储数据的) 主键索引的叶子节点存的是整行数据.在 InnoDB 里,主键索引也被称为聚簇索引(clustered index). 非主 ...