.Net的垃圾回收机制
.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从根引用表中查找所有引用对象,并继续查找引用对象树。这时,它才将没有引用变量的对象处理掉。
- 标记存活的对象并建立一个列表。
- 更新存活的对象的引用。
- 收回没有引用变量的的对象的空间。
- 整理堆空间,移动存活对象到区末尾。
GC运行的时间一般不需要用户控制,但是.Net提供接口System.Collect.GC()方法,让用户在需要的时候调用GC。
GC的性能提升
为了提高程序性能,GC采用了一些算法以加快回收速度,比如基于年龄的回收算法Age-based Garbage Collection,先回收最新的对象以及与其相关的对象。
何时调用GC
当以下情形之一出现时,系统调用GC回收内存
- 系统可用内存容量偏低。
- 已存在对象占用内存空间超过一定阙值。
- 用户调用GC.Collect()。
.Net的垃圾回收机制相关推荐
- 详细介绍Java垃圾回收机制
垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机 ...
- JAVA中的垃圾回收机制以及其在android开发中的作用
http://blog.csdn.net/xieqibao/article/details/6707519 这篇文章概述了JAVA中运行时数据的结构,以及垃圾回收机制的作用.在后半部分,描述了如何检测 ...
- 图解 Java 垃圾回收机制,写得非常好!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 原文:https://www.oracle.com/webfold ...
- 详解JVM内存管理与垃圾回收机制2 - 何为垃圾
随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...
- Python3.5源码分析-垃圾回收机制
Python3源码分析 本文环境python3.5.2. 参考书籍<<Python源码剖析>> python官网 Python3的垃圾回收概述 随着软硬件的发展,大多数语言都已 ...
- 深入浅出Java垃圾回收机制
2019独角兽企业重金招聘Python工程师标准>>> 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何 ...
- Java 垃圾回收机制,13张图给你讲清楚!
作者:Rhys_Lee 等等等 https://blog.csdn.net/zl1zl2zl3/article/details/90904088 什么是自动垃圾回收? 第一步:标记 第二步:清除 压缩 ...
- 安卓 java内存碎片_理解Android Java垃圾回收机制
Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆. 堆是运行 ...
- java垃圾回收机制_笔记 | Java垃圾回收机制
本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...
- JVM的垃圾回收机制详解和调优
1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的 ...
最新文章
- pandas将列表list插入到dataframe的单元格中、pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes)
- 浏览器内核_测量时间:从Java到内核再到
- pybind 回调 多线程 异常
- 【转】常用数据结构及复杂度
- Java-GUI编程实战之管理系统 Day3【学生管理系统GUI设计、学生管理系统增删改查、项目MVC结构介绍、Java技能图谱】
- 如何让Docker镜像飞起来
- [SpringBoot2]HelloWorld
- C++11新特性之八——函数对象function
- jmeter命令行运行-分布式测试
- OpenCV 3.1 imwrite()函数写入异常问题解决方法
- OpenShift 4 - 部署 RabbitMQ 集群
- 关于HTML静态页面(含自动分页)生成的可行性方案
- 使用pyinstaller打包pyqt5出错问题解决
- UITextField 对比 UITextView
- 【安装库】matlab2020b安装及百度网盘提速
- Vue - Nuxt.js 安装引入 WangEditor V5 富文本编辑器最新版本,超详细使用教程(Nuxt.js 项目使用官方提供的示例,页面报错,刷新就会报错navigator is解决方案)
- Mac使用技巧:关闭系统自动更新
- word另存为PDF时Mathtype公式显示不全的问题
- node生成唯一设备id(node-machine-id)
- html中的li标签不换行,css li 不换行(布局,内容)