C# 之 垃圾回收机制
编程语言中的“垃圾”是指那些没有用的对象,如果不销毁便始终占用内存,造成内存泄漏,传统的C++语言因为没有自动垃圾回收的机制,所以需要程序员手动控制内存的分配和释放,一不小心就可能造成一些非常难以排查的问题,C++中实现了一种称为“引用计数”的方法(智能指针)来跟踪一个对象,被多少个其他对象引用了,如果引用计数为0则表示需要回收了,然而,这种引用计数的方式有一个缺点就是在处理循环引用的时候不是特别好
C++中采用了WeakPtr来解决循环引用的问题。
在C#里,因为其内部自动垃圾回收机制,极大限度的方便了程序的开发,让程序员更省心了,但是我们还是有必要去了解一下C#的垃圾回收机制是如何运作的,这样可以帮助我们对C#有更深的认识。
在介绍垃圾回收之前,我们需要先理解一个托管堆的概念。
堆、栈
可能之前你也听说过堆栈、堆、栈这些概念,他们是什么关系呢?
堆用来存放程序运行时的对象,而栈则用于保存现场(例如局部变量、函数参数、调用过程的地址等),二者都是一种满足LIFO的数据结构。
而堆栈其实就是栈
堆和栈的一些区别:
1.内存分配方式
堆:程序员控制分配和释放,如果未释放则将在程序结束后由系统释放
栈:操作系统控制
2.缓存级别
堆:二级缓存,回收受垃圾回收机制影响
栈:一级缓存,用完立马释放,所以栈更快一些,但缺乏灵活性
3.数据结构的区别
堆:可以看做是一棵树
栈:数据结构中的栈
托管堆
CLR要求所有对象都要从托管堆分配,进程初始化时,CLR划分出一个地址空间作为托管堆,创建的所有对象都分配在该托管堆内。CLR还要维护一个指针,NextObjPtr,指向下一个对象在堆中的分配位置。
如果这个地址空间被非垃圾对象填满,那么CLR会分配更多的区域,直到达到该进程所能分配空间的上限。
32位进程最多分配1.5GB,64位进程最多分配8TB
在托管堆上添加一个对象是很快的,只需要在指针上加一个值即可。
为何需要垃圾回收?
答:虽然托管堆很牛逼,但毕竟内存是有限的。
垃圾回收算法
因为引用计数算法存在的问题(处理循环引用不太好),所以C#中采用了一种叫做引用跟踪的算法。
只关心引用类型的变量,把这些变量统称为根,C#的垃圾回收过程大致可以这么描述:先把堆中的对象全部标记为要回收,然后检查所有活动根,如果这个根引用了某个堆里的对象,则把这个对象标记为不回收,然后进入压缩阶段,即把要回收的对象从堆里拿出去,然后调整其他幸存下来的对象,使他们占据一个连续的空间,然后所有的根指向的地址的值(减去其指向的对象在内存中移动的偏移量),调整NextObjPtr到最后一个幸存者之后。
C# 之 垃圾回收机制相关推荐
- 详细介绍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都使用类似的 ...
最新文章
- .net导出到Excel与Word中(带上下标)
- 深度丨全球14家顶尖 AI 产业巨头深度学习实力及战略分析
- solver.prototxt参数说明(二)
- java继承circle类_java的继承
- first review of team blog(4.26)
- java中对象 引用的概念_java中的对象 方法 引用 等一些抽象的概念是什么意思呢?...
- 设置servlet或action作为欢迎页面
- 马云:不能把孩子放在温室里,光给孩子知识是不够的
- View(视图)——对话框之一般对话框
- 区块链网络安全平台HAPI获Genesis Block Ventures投资
- 图像滤镜艺术---Wave滤镜
- python 参数一样结果不一样_使用不同的参数多次调用同一个函数python
- 男人的爱只有一次----女孩你珍惜了吗
- 程序员,小红书王牌生活记录家。这是一篇记录程序员生涯的笔记。
- 图像相似度对比分析软件,图像相似度计算方法
- php 微信代扣开发步骤,PHP实现微信支付(jsapi支付)流程步骤详解
- ES6新特性有哪些?
- 中望3d快捷键命令大全_中望3D快捷键设置
- python语言的开题报告怎么写_开题报告怎么写
- 【shareX】自定义图片上传-基于tu.my最新版API