.Net的垃圾回收机制

news/2024/2/21 2:54:35

.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()。

http://www.ppmy.cn/news/945252.html

相关文章

java垃圾回收算法

常用的垃圾回收算法: 1.引用计数算法 给对象添加引用计算器,每多一个引用的地方就加一,引用失效时就减一,当计数器为0时,表明对象未被使用,垃圾回收器可以收集该对象 特点:实现简单&#xff…

浏览器垃圾回收机制

垃圾回收算法(v8) 可达性:从根节点出发,遍历所有的对象,可以遍历到的对象,就是可达的 根节点包含: 全局变量window文档DOM树存放在栈上的变量 例 let dog.a new Array(1)如果此时,将另外一个对象赋给a dog.a new Object()…

java1.8垃圾回收机制_JAVA垃圾回收机制

目录: 什么是垃圾 怎么判定垃圾 什么时候回收垃圾 怎么回收 垃圾回收器介绍 1.什么是垃圾 在JVM中,程序计数器、虚拟机栈、本地方法栈都是随线程生而生,随线程灭而灭(不需要管理); 栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理(不需要管理); 常说的垃…

golang的垃圾回收详解

文章目录 一、三色标记法二、并发垃圾回收三、并发垃圾回收导致的问题四、三色不变式1.强三色不变式1.弱三色不变式 五、插入写屏障六、删除写屏障五、混合写屏障六、混合写屏障的思考七、抢占试调度七、官方源码注释和文章 一、三色标记法 作为一门现代化的语言,go…

cocosCreator 3.6以上接入腾迅Bugly 捕捉JS错误 Android

cocosCreator3.6以上接入Bugly上报其实很简单,不需要网上那么多弯弯绕,三须三步走。 1. 按照官网方式接入android的bugly 2. android端写一个Bugly上报管理类 3. 修改你工程目录下native\engine\common\Classes\目录下的Game.h, Game.cpp两个文件&…

(五)「消息队列」之 RabbitMQ 主题(使用 .NET 客户端)

0、引言 先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口(5672)上运行。如果您使用了不同的主机、端口或凭证,则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题,可以通过邮件列表或者 RabbitMQ 社区…

学习记录——SpectFormer、DilateFormer、ShadowFormer、MISSFormer

SpectFormer: Frequency and Attention is what you need in a Vision Transformer, arXiv2023 频域混合注意力SpectFormer 2023 论文:https://arxiv.org/abs/2304.06446 代码:https://badripatro.github.io/SpectFormers/ 摘要视觉变压器已经成功地应用…

Spring Boot进阶(56):使用 ECharts 绘制各种花哨的统计图 | 超级详细,建议收藏

1. 前言🔥 在前几期,我们重点学习了如何在Spring Boot中使用模板引擎Thymeleaf开发Web应用的基础。接下来,我们介绍一下后端开发经常会遇到的一个场景:可视化图表。比如如下: 通常啊,这类业务在客户端应用中…

管理决定企业的生命周期

不管你信不信,管理是一门科学,是企业的操作系统,设计不好,bug不断,影响着企业的运转效率及生命周期,它比单纯的核心技术更能影响企业。

对变量的理解(交换两个值的变量)

// 对变量的理解: // 1、声明变量的本质就是去内存中申请一个存数据的空间 // 2、变量的主要功能用来储存数据,相当于一个容器 // 3、变量的使用,一定是先声明,再赋值 /* 交换两个变量的值 var red_apple 红苹果var blue_apple…

方法工厂模式(Method Factory Pattern)_Java

Method Factory Pattern 工厂方法模式工厂模式总共有三种 简单工厂模式 工厂方法模式 抽象工厂模式 我们先不说怎么分他们,我们先说问题! 还拿水果工厂来说,以前科技不发达,苹果就是苹果,橘子就是橘子,现在…

DeepMind提出SCAN:仅需五对样本,学会新的视觉概念!

雷锋网 AI科技评论按:DeepMind实验室发布名为符号-概念联合网络(Symbol-Concept Association Network,SCAN)的新型神经网络模型,可以让计算机模仿人类视觉和词汇获取的方法,通过重组学到的概念,…

ecliespe 中启动tocmat报错解决方案

# hs_err_pid8272.log文件中报如下错 # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 2501856 bytes for Chunk::new # Possible reasons: # The system is out of physical RAM …

人工智能与阅读能力的关系研究

人工智能与阅读能力的关系研究 研究表明:汉字的顺序颠倒也不会影响阅读,这是为什么呢! 研表究明,汉字的序顺并不能影阅响读,比如当你看完这话句时,你会发这现里面的字全是都乱的!有谁中招了&a…

给思想洗澡

笛卡尔是这个世界上最大为的哲学家,思想家,他提出的两个思想实验: 普遍怀疑论不可知论本篇文章也主要围绕这两个点来讲解。 普遍怀疑论 先来看普遍怀疑,笛卡尔认为,每个人一生中都应该“彻底地对自己的全部见解进行一次大扫除“,我们把许多错误的知识当作真理接受下来,…

java8-Beh2param

2019独角兽企业重金招聘Python工程师标准>>> java8更加高效,功能,工具更多 stream processing 抽象 并行更简单 method reference lambdas Predicate default methods Optional 一. Beh2param 行为参数化 eg:农夫想要找出一堆有特…

农村宝妈省钱记:一块钱也能养多肉!

本人95后农村宝妈一枚,爱多肉但是经济有限,对我来说一块钱也能养多肉,若买些叶子来叶插更加实惠。大家每天看大神的文章也许有些心急,也想养出那样的状态。但是养肉不是为了攀比,而是为了享受把肉肉从小养大养出状态的…

java行为参数化_java8 行为参数化

java8更加高效,功能,工具更多 stream processing 抽象 并行更简单 method reference lambdas Predicate default methods Optional 一. Beh2param 行为参数化 eg:农夫想要找出一堆有特点的苹果,颜色 想法一:想要红苹果…

ElasticSearch 写入数据过程(增删改查)

ElasticSearch (以下简称es) ES写数据过程 当客户端对一个node发出写入请求这个node可以称为协调节点协调节点会将document路由到实际节点node的primary shard上,当主分片成功处理这个请求,将请求并行发给备份分片, (primary shard 对应的r…

oracle 嵌套语句,请问一条SQL语句(查询,嵌套)

当前位置:我的异常网 Oracle管理 请问一条SQL语句(查询,嵌套) 请问一条SQL语句(查询,嵌套) www.myexceptions.net 网友分享于:2013-02-13 浏览:77次 请教一条SQL语句(查询,嵌套) 现有主表Table1,副表Tab…
最新文章