浅谈.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代 | |||||
| A | B | C | D | E | |
然后存活下来的对象A B D提升到第1代
第1次回收后
| 第1代 | 第0代 | |||||||
| A | B | D | ||||||
0代再次分配一个新对象超过预算后
第2次回收前
| 第1代 | 第0代 | |||||||
| A | B | D | F | G | H | I | J | |
存活下来的对象F G I 提升到了第一代 对象A D已经没有活动的字段引用但是第1代没有触发回收条件所以A D不会被回收,所以无用的老对象可能存活的时间可能比无用的新对象要久
第2次回收后
| 第1代 | 第0代 | ||||||||||
| A | B | D | F | G | I | ||||||
0代再次分配一个新对象超过预算后,此时第1代内存分配也超出预算,同时对象G也已经没有活动的字段引用
第3次回收前
| 第1代 | 第0代 | ||||||||||
| A | B | D | F | G | I | J | K | L | M | N | |
1代存活的提升到了第2代,0代存活的提升到了第1代
第3次回收后
| 第2代 | 第1代 | 第0代 | ||||||||||
| B | F | I | J | K | L | N | ||||||
除了常见的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设备读取数据的命令。下面是一个简单的示例代码,演示如何使用SCSI Read(10)命令来读取指定大小的文件: #include <stdio.h> #include <stdlib.h> #include <string.h>#define READ_CAPACITY_CMD 0x2…...
c#设计模式-行为型模式 之 策略模式
🚀简介 🐤作为一个开发人员,开发需要选择一款开发工具,如在编写C#时,我们可以选择VisualStudio进行开发,也可以使用Rider 进行开发。 🐳该模式定义了一系列算法,并将每个算法封装起来…...
【拿完年终奖后】想要转行网络安全,一定不要错过这个时间段。
网络安全,作为当下互联网行业中较为热门的岗位,薪资可观、人才需求量大,作为转行必考虑。 在这里奉劝所有零基础想转行(入门) 网络安全的朋友们 在转行之前,一定要对网络安全行业做一个大概了解…...
day10_复习_数组_方法
非常重要的: 方法设计(参数,返回值,调用) 数组也重要,但是后续很少用! 是因为后期有更简单的【集合】,重要在于是一种思想,也是一种代码逻辑 关于数组: 声明创建取值,存值遍历面试|算法 --> 排序内存图(堆,栈,引用) 今天 数组工具类: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年全球市场数字干膜测量仪总体规模、主要生产商、主要地区、产品和应用细分研究报告
内容摘要 按收入计,2022年全球数字干膜测量仪收入大约149.2百万美元,预计2029年达到191.6百万美元,2023至2029期间,年复合增长率CAGR为 3.6%。同时2022年全球数字干膜测量仪销量大约 ,预计2029年将达到 。2022年中国市…...
Python爬虫脚本的基本组成
一个基本的Python爬虫脚本通常由以下几部分组成: 导入必要的库:Python中有许多库可用于爬虫,如requests用于发送HTTP请求,BeautifulSoup用于解析HTML或XML,selenium用于模拟浏览器操作等。你需要根据你的需求导入相应…...
IIS部署Flask
启用 CGI 安装wfastcgi pip install wfastcgi 启用 wfastcgi 首先以管理员身份运行wfastcgi-enable来在IIS上启用wfastcgi,这个命令位于c:\python_dir\scripts,也就是你需要确保此目录在系统的PATH里,或者你需要cd到这个目录后再执行。 #…...
告警繁杂迷人眼,多源分析见月明
随着数字化浪潮的蓬勃兴起,网络安全问题日趋凸显,面对指数级增长的威胁和告警,传统的安全防御往往力不从心。网内业务逻辑不规范、安全设备技术不成熟都会导致安全设备触发告警。如何在海量众多安全告警中识别出真正的网络安全攻击事件成为安…...
【Python】概述
【Python】概述 特点 Python 是一种面向对象、解释性、弱类型(动态数据类型)的脚本语言(高级程序设计语言)。 由于Python是解释型语言,所以具有跨平台特性。 解释型语言: 这意味着开发过程中没有了编译…...
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 : 1.2 报错 2 2.解决方案 介绍 ONNX(Open Neural Network Exchange)是一个用于机器学习模型的开放式标准,它旨在使不同的深度学习框架能够将训练好的模型在不同平台上无缝运行。它是由Microsoft和F…...
2023年全球市场儿科PICC导管总体规模、主要生产商、主要地区、产品和应用细分研究报告
内容摘要 按收入计,2022年全球儿科PICC导管收入大约 百万美元,预计2029年达到 百万美元,2023至2029期间,年复合增长率CAGR为 %。同时2022年全球儿科PICC导管销量大约 ,预计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…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
