我是靠谱客的博主 醉熏砖头,最近开发中收集的这篇文章主要介绍.Net的垃圾回收机制什么是垃圾回收机制Garbage Collector运行机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

.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的垃圾回收机制什么是垃圾回收机制Garbage Collector运行机制的全部内容,希望文章能够帮你解决.Net的垃圾回收机制什么是垃圾回收机制Garbage Collector运行机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部