当前位置: 首页 > news >正文

浅谈.net 垃圾回收机制(1)

大家都知道.net程序创建对象后没法写代码销毁对象,它有它自己的处理机制,今天来大概说说它的原理,探讨下它是如何管理对象即管理内存的

在程序里使用new 关键字实例化一个对象 如果这个对象类型是引用类型则在堆上分配然后由GC管理

new 操作符编译运行时会做4件事:

1、计算对象占内存大小:包括对象的所有基类定义的所有实例字段需要的字节数,以及类型对象指针和同步块索引(这两个额外成员后面章节会详说)

2、从堆上上分配需要大小的字节数的内存,内存中所有的字节都会清0

3、初始化对象的类型对象指针和同步块索引

4、调用类型构造器初始化定义的实例字段返回引用地址并维护指针NextObjPtr(=当前对象返回的引用地址+当前对象占用的字节数)的值

现在对象是创建好了那它在什么时候回收呢?

因为GC在回收时有个代的概念总共有3代可以理解成把内存分成3段,GC有它的触发条件,最常见的触发条件是0代对象内存分配超过预算就会触发GC:

0代分配一个新对象超过预算后,就会触发一次垃圾回收,GC时会暂定该程序进程中的所有线程,并遍历该程序堆中的所有对象,如果有正在运行字段引用了该对象,就在该对象的同步块索引的最后一位标记1,然后将0代所有不是1的对象都回收掉(重写析构函数的不会回收掉)

第1次回收前 

第0代
ABCDE 

然后存活下来的对象A B D提升到第1代

第1次回收后

第1代第0代 
ABD      

0代再次分配一个新对象超过预算后

第2次回收前

第1代第0代 
ABDFGHIJ 

存活下来的对象F G I 提升到了第一代 对象A D已经没有活动的字段引用但是第1代没有触发回收条件所以A D不会被回收,所以无用的老对象可能存活的时间可能比无用的新对象要久

第2次回收后

第1代第0代 
ABDFGI      

0代再次分配一个新对象超过预算后,此时第1代内存分配也超出预算,同时对象G也已经没有活动的字段引用

第3次回收前

第1代第0代 
ABDFGIJKLMN 

1代存活的提升到了第2代,0代存活的提升到了第1代

第3次回收后

第2代第1代第0代 
BFIJKLN      

除了常见的0代超预算,还有以下4种情况会触发GC

1、代码显示调用System.GC的静态Collect方法

2、Windows报告低内存的情况

3、CLR正在卸载AppDomain

4、CLR正在关闭

注意一般小对象会优先分配在0代上如果一个对象超过或等于85000字节会直接分配在第2代上,然后从上面的图可以看到每次垃圾回收后对象的位置都在变化,所以对象的引用地址在每次垃圾回收后是会变化的,如果不希望它的引用地址发生变化可以通过GCHandler设置属性为Pinned,但这样会导致内存碎片。

相关文章:

浅谈.net 垃圾回收机制(1)

大家都知道.net程序创建对象后没法写代码销毁对象,它有它自己的处理机制,今天来大概说说它的原理,探讨下它是如何管理对象即管理内存的 在程序里使用new 关键字实例化一个对象 如果这个对象类型是引用类型则在堆上分配然后由GC管理 new 操作…...

超大视频如何优雅切片

背景 有一次录屏产生了一个大小为33G的文件, 我想把他上传到B站, 但是B站最大只支持4G. 无法上传, 因此做了一个简单的探索. 质疑与思考 a. 有没有一个工具或一个程序协助我做分片呢? 尝试 a. 必剪 > 有大小限制, 添加素材加不进去(而且报错信息也提示的不对) b. PR &…...

计算机竞赛 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基…...

Spring总结的question

Spring 一. 控制反转(IoC) 1.手动 使用了Spring的Configuration和Bean注解来明确指定了哪些类需要被纳入容器的管理。在AppConfig配置类中,通过Bean注解创建了Service和Controller的实例,Spring会自动将这些实例纳入容器的管理,并处理它们…...

LVS和keepalived

Keepalived及其工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器&#x…...

2023年腾讯云优惠券(代金券)无门槛领取方法汇总

腾讯云作为国内知名的云计算服务提供商,为了吸引用户,腾讯云经常推出各种优惠活动,其中包括优惠券的免费发放。通过使用优惠券,可以享受到更多的折扣和优惠,节省成本,获得更好的用户体验。那么,…...

linux scsi命令读取文件

SCSI Read(10)是一种用于从SCSI设备读取数据的命令。下面是一个简单的示例代码&#xff0c;演示如何使用SCSI Read(10)命令来读取指定大小的文件&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#define READ_CAPACITY_CMD 0x2…...

c#设计模式-行为型模式 之 策略模式

&#x1f680;简介 &#x1f424;作为一个开发人员&#xff0c;开发需要选择一款开发工具&#xff0c;如在编写C#时&#xff0c;我们可以选择VisualStudio进行开发&#xff0c;也可以使用Rider 进行开发。 &#x1f433;该模式定义了一系列算法&#xff0c;并将每个算法封装起来…...

【拿完年终奖后】想要转行网络安全,一定不要错过这个时间段。

网络安全&#xff0c;作为当下互联网行业中较为热门的岗位&#xff0c;薪资可观、人才需求量大&#xff0c;作为转行必考虑。 在这里奉劝所有零基础想转行&#xff08;入门&#xff09; 网络安全的朋友们 在转行之前&#xff0c;一定要对网络安全行业做一个大概了解&#xf…...

day10_复习_数组_方法

非常重要的: 方法设计(参数,返回值,调用) 数组也重要,但是后续很少用! 是因为后期有更简单的【集合】&#xff0c;重要在于是一种思想&#xff0c;也是一种代码逻辑 关于数组: 声明创建取值,存值遍历面试|算法 --> 排序内存图(堆,栈,引用) 今天 数组工具类:Arrays数组扩容(拷…...

Linux:TCP三握四挥简析

文章目录 1. 前言2. 背景3. TCP连接的建立和断开3.1 TCP协议状态机3.2 TCP的三握四挥3.2.1 TCP 连接建立的三次握手过程分析3.2.1.1 服务端和客户端套接字的创建3.2.1.2 服务端进入 LISTEN 状态3.2.1.3 服务端在 LISTEN 状态等待客户端的 SYN 请求3.2.1.4 客户端向服务端发送 S…...

2023年全球市场数字干膜测量仪总体规模、主要生产商、主要地区、产品和应用细分研究报告

内容摘要 按收入计&#xff0c;2022年全球数字干膜测量仪收入大约149.2百万美元&#xff0c;预计2029年达到191.6百万美元&#xff0c;2023至2029期间&#xff0c;年复合增长率CAGR为 3.6%。同时2022年全球数字干膜测量仪销量大约 &#xff0c;预计2029年将达到 。2022年中国市…...

Python爬虫脚本的基本组成

一个基本的Python爬虫脚本通常由以下几部分组成&#xff1a; 导入必要的库&#xff1a;Python中有许多库可用于爬虫&#xff0c;如requests用于发送HTTP请求&#xff0c;BeautifulSoup用于解析HTML或XML&#xff0c;selenium用于模拟浏览器操作等。你需要根据你的需求导入相应…...

IIS部署Flask

启用 CGI 安装wfastcgi pip install wfastcgi 启用 wfastcgi 首先以管理员身份运行wfastcgi-enable来在IIS上启用wfastcgi&#xff0c;这个命令位于c:\python_dir\scripts&#xff0c;也就是你需要确保此目录在系统的PATH里&#xff0c;或者你需要cd到这个目录后再执行。 #…...

告警繁杂迷人眼,多源分析见月明

随着数字化浪潮的蓬勃兴起&#xff0c;网络安全问题日趋凸显&#xff0c;面对指数级增长的威胁和告警&#xff0c;传统的安全防御往往力不从心。网内业务逻辑不规范、安全设备技术不成熟都会导致安全设备触发告警。如何在海量众多安全告警中识别出真正的网络安全攻击事件成为安…...

【Python】概述

【Python】概述 特点 Python 是一种面向对象、解释性、弱类型&#xff08;动态数据类型&#xff09;的脚本语言&#xff08;高级程序设计语言&#xff09;。 由于Python是解释型语言&#xff0c;所以具有跨平台特性。 解释型语言&#xff1a; 这意味着开发过程中没有了编译…...

MySQL运维之日志管理

目录 一、日志 1.1错误日志 1.2二进制日志 1.2.1格式 1.2.2查看 1.2.3删除 1.3查询日志...

Yolov5 ONNX导出报错: export failure: Unsupported ONNX opset version: 17

目录 1.问题描述 1.1 报错1 &#xff1a; 1.2 报错 2 2.解决方案 介绍 ONNX&#xff08;Open Neural Network Exchange&#xff09;是一个用于机器学习模型的开放式标准&#xff0c;它旨在使不同的深度学习框架能够将训练好的模型在不同平台上无缝运行。它是由Microsoft和F…...

2023年全球市场儿科PICC导管总体规模、主要生产商、主要地区、产品和应用细分研究报告

内容摘要 按收入计&#xff0c;2022年全球儿科PICC导管收入大约 百万美元&#xff0c;预计2029年达到 百万美元&#xff0c;2023至2029期间&#xff0c;年复合增长率CAGR为 %。同时2022年全球儿科PICC导管销量大约 &#xff0c;预计2029年将达到 。2022年中国市场规模大约为 百…...

Adler-32算法使用Neon优化

1、简单实现 下面代码是Adler-32算法的简单实现,我们来整理一下这段代码的逻辑: A = 1 + D1 + D2 + ... + Dn (mod 65521)B = (1 + D1) + (1 + D1 + D2) + ... + (1 + D1 + D2 + ... + Dn) (mod 65521)= nxD1 + (n-1) x D2 + (n-2) x D3 + ... + Dn + n (mod 65521)Adler-3…...

NExT-GPT:从多模态对齐到任意模态生成的架构与实战

1. 项目概述&#xff1a;从“多模态”到“任意模态”的进化 如果你在过去一年里关注过AI领域&#xff0c;一定对“多模态大模型”这个词不陌生。从GPT-4V到Gemini&#xff0c;主流模型都在努力让AI能同时理解文本和图像。但不知道你有没有想过一个问题&#xff1a;为什么我们和…...

移动端AI智能体Operit AI:打造离线可编程的Android全能助手

1. 项目概述&#xff1a;在手机上构建你的全能AI副驾如果你和我一样&#xff0c;是个重度效率工具爱好者&#xff0c;同时又对AI技术充满好奇&#xff0c;那么你肯定也经历过这样的困境&#xff1a;手机上的AI助手&#xff0c;要么是功能单一的聊天机器人&#xff0c;要么就是需…...

别再只用GitHub了!手把手教你用GitLab搭建团队专属代码仓库(从群组到项目实战)

别再只用GitHub了&#xff01;手把手教你用GitLab搭建团队专属代码仓库&#xff08;从群组到项目实战&#xff09; 在开源生态中&#xff0c;GitHub无疑是代码托管平台的代名词。但对于需要私有化部署和精细权限控制的团队而言&#xff0c;GitLab提供了更完整的DevOps解决方案。…...

告别繁琐配置:Jprotobuf注解驱动序列化实战(新手友好)

1. 为什么选择Jprotobuf注解方案 如果你正在用Java开发需要频繁序列化数据的应用&#xff0c;比如缓存系统、微服务通信或者游戏服务器&#xff0c;肯定遇到过这样的纠结&#xff1a;用JSON虽然方便但性能差体积大&#xff0c;用Protobuf性能好但配置太麻烦。我去年做电商订单系…...

MTKClient实战指南:联发科设备刷机与逆向工程全面解决方案

MTKClient实战指南&#xff1a;联发科设备刷机与逆向工程全面解决方案 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient MTKClient是一款专为联发科芯片设备设计的开源逆向工程与刷机工具&am…...

别再折腾Anaconda了!用PyCharm 2024.1自带工具5分钟搞定TensorFlow 2.15 + Keras 3环境

PyCharm 2024.1极简指南&#xff1a;5分钟无痛部署TensorFlow 2.15 Keras 3深度学习环境 深度学习环境配置曾是无数开发者的噩梦——直到PyCharm 2024.1彻底改变了游戏规则。最新版本集成的环境管理工具让TensorFlow和Keras的安装变得像点外卖一样简单&#xff0c;完全跳过了传…...

使用curl命令直接调试Taotoken大模型聊天接口的详细步骤

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用curl命令直接调试Taotoken大模型聊天接口的详细步骤 对于需要在底层进行调试、验证或是在无特定SDK环境中工作的开发者而言&am…...

解锁视频字幕提取新姿势:RapidVideOCR如何让硬字幕变软文

解锁视频字幕提取新姿势&#xff1a;RapidVideOCR如何让硬字幕变软文 【免费下载链接】RapidVideOCR &#x1f3a6; Extract video hard subtitles and automatically generate corresponding srt files. 项目地址: https://gitcode.com/gh_mirrors/ra/RapidVideOCR 你…...

计算机视觉入门:从OpenCV到PyTorch的实践指南

1. 项目概述&#xff1a;从“萌芽”到“入行”的视觉之旅 “对计算机视觉的萌芽迷恋”——这个标题精准地捕捉了无数技术爱好者&#xff0c;包括我自己&#xff0c;最初踏入这个领域时的心路历程。它描述的是一种状态&#xff1a;你或许被一张AI生成的艺术图片所震撼&#xff…...

实战指南:5分钟掌握ImageToSTL图片转3D模型技术

实战指南&#xff1a;5分钟掌握ImageToSTL图片转3D模型技术 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left side. 项目…...