.Net 的垃圾回收机制

  • 什么是垃圾回收机制
  • Garbage Collector运行机制
    • 处理值类型对象
    • 处理引用类型对象
      • 引用类型对象的存放机制
      • 小对象堆的处理机制
      • GC 的回收过程
      • GC的性能提升
      • 何时调用GC

什么是垃圾回收机制

在.Net 平台,用户可以手动也可以通过.Net提供的垃圾收集器Garbage Collector(后称GC)释放被占用的资源。总所周知,.Net的内存分为可管理内存和不可管理内存,可管理内存包括栈stack和可管理堆managed heap,不可管理内存就是不可管理堆,包括文件的Handler、数据库的Connection等等。可管理内存可以让GC自动处理,而不可管理内存只能用户手动清理。这就是.Net 的垃圾回收机制。

Garbage Collector运行机制

处理值类型对象

由于值类型对象被存放在栈中,GC可以直接清理。所以这里重点说一下引用类型对象。

处理引用类型对象

引用类型对象的存放机制

引用类型对象被分为大对象(超过85K)和小对象(小于85K),大对象被专门放在一个特殊堆中,因为每次GC清理完一些对象后,堆中会出现一些不连续的空闲的内存空间,导致堆空间碎片化,因此GC把仍存在的对象移动在一片连续的内存空间里,这样避免内存空间浪费,这一过程被称为压缩堆。而大对象移动的起来比较费劲,所以将大对象和小对象放在独立的两个堆里。大对象堆是从来不压缩的。

小对象堆的处理机制

.Net将小对象堆分为三代区块(generation 0, 1, 2 section),从0代区到2代区,最新建立的对象存放在0代区;GC运行第一次后,存活下的对象被放到1代区,新对象放到0代区;GC第二次运行后,重复刚才的过程,1代区存活的对象放到2代区,0代区对象放到1代区。二代区和大对象区的收集处理工作由一个专门的后台线程完成,所以主程序线程只被0代区和1代区的处理线程阻塞,和其他区没有关系。大对象堆在物理上是独立的空间,但是根据微软的文档,它在逻辑上被认为是2代区的一部分,所以也可以认为大对象直接被存放在2代区。

GC 的回收过程

GC处理引用类型对象时,首先要清理其栈中的引用变量,但是并不立即处理对应的存放在堆中的对象。GC从根引用表中查找所有引用对象,并继续查找引用对象树。这时,它才将没有引用变量的对象处理掉。

  1. 标记存活的对象并建立一个列表。
  2. 更新存活的对象的引用。
  3. 收回没有引用变量的的对象的空间。
  4. 整理堆空间,移动存活对象到区末尾。

GC运行的时间一般不需要用户控制,但是.Net提供接口System.Collect.GC()方法,让用户在需要的时候调用GC。

GC的性能提升

为了提高程序性能,GC采用了一些算法以加快回收速度,比如基于年龄的回收算法Age-based Garbage Collection,先回收最新的对象以及与其相关的对象。

何时调用GC

当以下情形之一出现时,系统调用GC回收内存

  • 系统可用内存容量偏低。
  • 已存在对象占用内存空间超过一定阙值。
  • 用户调用GC.Collect()。

.Net的垃圾回收机制相关推荐

  1. 详细介绍Java垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机 ...

  2. JAVA中的垃圾回收机制以及其在android开发中的作用

    http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...

  3. 图解 Java 垃圾回收机制,写得非常好!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 原文:https://www.oracle.com/webfold ...

  4. 详解JVM内存管理与垃圾回收机制2 - 何为垃圾

    随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...

  5. Python3.5源码分析-垃圾回收机制

    Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的垃圾回收概述 随着软硬件的发展,大多数语言都已 ...

  6. 深入浅出Java垃圾回收机制

    2019独角兽企业重金招聘Python工程师标准>>> 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何 ...

  7. Java 垃圾回收机制,13张图给你讲清楚!

    作者:Rhys_Lee 等等等 https://blog.csdn.net/zl1zl2zl3/article/details/90904088 什么是自动垃圾回收? 第一步:标记 第二步:清除 压缩 ...

  8. 安卓 java内存碎片_理解Android Java垃圾回收机制

    Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆. 堆是运行 ...

  9. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

  10. JVM的垃圾回收机制详解和调优

    1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的 ...

最新文章

  1. pandas将列表list插入到dataframe的单元格中、pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes)
  2. 浏览器内核_测量时间:从Java到内核再到
  3. pybind 回调 多线程 异常
  4. 【转】常用数据结构及复杂度
  5. Java-GUI编程实战之管理系统 Day3【学生管理系统GUI设计、学生管理系统增删改查、项目MVC结构介绍、Java技能图谱】
  6. 如何让Docker镜像飞起来
  7. [SpringBoot2]HelloWorld
  8. C++11新特性之八——函数对象function
  9. jmeter命令行运行-分布式测试
  10. OpenCV 3.1 imwrite()函数写入异常问题解决方法
  11. OpenShift 4 - 部署 RabbitMQ 集群
  12. 关于HTML静态页面(含自动分页)生成的可行性方案
  13. 使用pyinstaller打包pyqt5出错问题解决
  14. UITextField 对比 UITextView
  15. 【安装库】matlab2020b安装及百度网盘提速
  16. Vue - Nuxt.js 安装引入 WangEditor V5 富文本编辑器最新版本,超详细使用教程(Nuxt.js 项目使用官方提供的示例,页面报错,刷新就会报错navigator is解决方案)
  17. Mac使用技巧:关闭系统自动更新
  18. word另存为PDF时Mathtype公式显示不全的问题
  19. node生成唯一设备id(node-machine-id)
  20. html中的li标签不换行,css li 不换行(布局,内容)

热门文章

  1. 护网行动面试题目汇总
  2. plupload断点续传 php,Plupload 文件断点续传,文件分块上传
  3. 分析Http请求头获取爱帮公交数据
  4. 涂鸦智能植物生长机lite(硬件篇)
  5. 数据挖掘:R语言BP神经网络
  6. 无线振弦自动化采集系统岩土工程监测
  7. 使用JDB操作数据库—增删改查(二)
  8. 2019国内手机市场研判:道路千万条,健康第一条
  9. ESP 保姆级教程 基础篇 —— 环境安装、NodeMcu引脚介绍
  10. 【量化策略系列】股票均值回归策略之一——配对交易策略(Pairs Trading)