25.02.04 《CLR via C#》 笔记14
第二十一章 托管堆和垃圾回收
- 内存分配过程 CLR维护一个“下一次分配指针”(NextObjPtr),指向当前托管堆中第一个可用的内存地址
- 计算类型所需的字节数,加上对象开销(类型对象指针、同步块索引)所需字节数,检查空间是否足够
- 如果空间足够,更新指针到分配的对象末尾
- 如果空间不足,触发垃圾回收释放未使用内存
- 垃圾回收算法
- 把引用类型变量称为根
- 标记:暂停所有线程,遍历堆中所有对象,在同步块索引上标记为应该删除(不可达);如果任何根引用了堆上的对象,则标记为可达
- 压缩:移动幸存的对象,使它们占用连续的空间(类似碎片整理),同时更新被移动对象的地址
- 移动NextObjPtr,指向最后一个幸存对象之后的位置
- 如果回收不了内存,说明内存已耗尽,抛出异常
- 静态字段引用的对象一直存在,可能会使其引用的对象一直存活,造成内存泄漏
- 分代回收算法(原理:新分配的对象生存周期短,老对象生存周期长)
- 新创建的对象称为第0代对象,CLR初始化时为第0代选择一个预算容量,当容量不足时触发垃圾回收,幸存的对象就是第1代
- 如果根或对象引用了老一代的某个对象,那么可以忽略老对象内部的所有引用;如果老对象引用了新对象,设置了其他机制标记
- 如果第1代也用完预算,则变为第2代,同时第0代变为第1代;最高就是第2代,没有第3代
- 预算大小是CLR根据每次回收垃圾的多少来动态决定的(启发式算法)
- 如果第0代所有对象都是垃圾,可以通过将NextObjPtr移到起始处直接完成垃圾回收
- 垃圾回收触发条件
- 代码显式调用Collect方法回收(不推荐)
- windows报告内存低
- CLR卸载AppDomain 执行所有代的回收
- CLR关闭 进程终止,由windows回收进程全部内存
- 大对象 大于85KB的大对象专门分配在大对象堆,GC不会压缩大对象,大对象总是第2代
- 垃圾回收模式
- 工作站模式:针对单用户环境优化,单线程垃圾回收,低延迟优先
- 服务器模式:针对多用户优化,多线程垃圾回收,堆空间更大,暂停时间较长
- 应尽量避免使用Finalize:这个方法在GC结束后调用,由于该方法中可能使用到对象的字段,导致对象在回收时延长了存活时间;Finalize方法的执行时间和顺序是不可控制的;Finalize方法在专用的线程上执行,一旦阻塞则无法调用其他Finalize方法造成内存一直泄露
- 封装本机资源时推荐从SafeHandle类派生,以保证本机资源在垃圾回收时释放
- IDisposable接口
- 如果类定义的一个字段实现了dispose模式,那么类本身也应该实现dispose模式
- 对象被显式dispose后,对象本身依然存在
- using语句初始化对象,编译器会自动生成try-finally块,并在finally中调用Dispose方法
- StreamWriter包装了一个Stream(FileStream或MemoryStream),如果没有显式调用Dispose,会造成缓冲区丢失(StreamWriter不支持终结,就算支持,如果Stream先终结,StreamWriter也无法正确终结)
- 本机资源可能占用大量内存,而占用很小的托管内存,为使GC能正确感知内存压力,及时执行垃圾回收,可以使用AddMemoryPressure、RemoveMemoryPressure来修正
- Finalize的原理:维护一个终结列表和F-Reachable队列,当对象的实例构造器被调用前,如果定义了Finalize方法,则加入终结列表;被当可终结对象被回收时,离开终结列表进入freachable 队列(此时对象又有引用了(被这个队列引用),不再是垃圾),然后由专用线程调用队列中对象的Finalize方法;调用完成后,对象可能被提升到较老的一代,然后等待下次被回收(此时已经不在终结列表中了,这次会被正常回收)。
- GCHandle类提供了对托管对象的直接控制,避免垃圾回收器意外回收对象
-
标志位GCHanleType定义
- Weak,弱引用,此类型的句柄不会阻止垃圾回收器回收对象。如果对象被垃圾回收,句柄会指向 null,回收后不可访问,无法恢复
- WeakTrackResurrection,弱引用,但Finalize调用后仍然可达,在终结器完成之前句柄仍有效
- Normal,普通句柄,对象在使用该类型的句柄时不会被垃圾回收,必须手动释放句柄
- Pinned,固定句柄,对象固定在内存中,垃圾回收器不能移动它
-
弱引用:当对象只通过弱引用被引用时,垃圾回收器会认为该对象是不可达的,从而可以对其进行回收
-
用GCHandle创建一个对象的弱引用(Weak),当GCHandle.Target返回null时表示对象已经被回收
-
用GCHandle创建一个对象的Normal引用,然后将此对象传给非托管代码,非托管代码就可以使用GCHandle.Target来获取托管对象的指针,这能保证托管对象一直存活、在内存中移动也不丢失;如果已用完,需用Free方法释放
-
用GCHandle创建一个对象的Pinned引用,然后用GCHandle.AddrOfPinnedObject获得已固定对象的指针,保证该地址中的数据在内存中不会移动
-
fixed语句可以直接在unsafe代码块中临时固定对象
-
ConditionalWeakTable:实现了对Key是弱引用,但只要key未被回收,value一定未被回收
-
相关文章:
25.02.04 《CLR via C#》 笔记14
第二十一章 托管堆和垃圾回收 内存分配过程 CLR维护一个“下一次分配指针”(NextObjPtr),指向当前托管堆中第一个可用的内存地址 计算类型所需的字节数,加上对象开销(类型对象指针、同步块索引)所需字节数…...
day8-面向对象
目录 面向对象1、面向对象介绍2、类和对象类和对象类的几个补充注意事项 3、封装 面向对象 1、面向对象介绍 ⭐️面向对象介绍: 面向:拿、找对象:能干活的东西面向对象编程:拿东西过来做对应的事情 面向对象编程的例子&#x…...
Pyside6 的QObject 类
PySide6 中的 QObject 是 Qt 框架的核心基类,所有需要信号与槽、事件处理、内存管理的对象均需要继承自它。以下是关于 QObject 的详细说明,从功能、关键特性到实际代码示例进行阐述: 1. 核心功能 QObject 提供了以下基本能力: …...
【Java】位图 布隆过滤器
位图 初识位图 位图, 实际上就是将二进制位作为哈希表的一个个哈希桶的数据结构, 由于二进制位只能表示 0 和 1, 因此通常用于表示数据是否存在. 如下图所示, 这个位图就用于标识 0 ~ 14 中有什么数字存在 可以看到, 我们这里相当于是把下标作为了 key-value 的一员. 但是这…...
基于联合概率密度与深度优化的反潜航空深弹命中概率模型研究摘要
前言:项目题材来自数学建模2024年的D题,文章内容为笔者和队友原创,提供一个思路。 摘要 随着现代军事技术的发展,深水炸弹在特定场景下的反潜作战效能日益凸显,如何最大化的发挥深弹威力也成为重要研究课题。本文针对评估深弹投掷落点对命中潜艇概率的影响进行分析,综合利…...
【自然语言处理(NLP)】生成词向量:GloVe(Global Vectors for Word Representation)原理及应用
文章目录 介绍GloVe 介绍核心思想共现矩阵1. 共现矩阵的定义2. 共现概率矩阵的定义3. 共现概率矩阵的意义4. 共现概率矩阵的构建步骤5. 共现概率矩阵的应用6. 示例7. 优缺点优点缺点 **总结** 目标函数训练过程使用预训练的GloVe词向量 优点应用总结 个人主页:道友老…...
红黑树的封装
一、封装思路 在 STL 中 map set 的底层就是封装了一棵红黑树。 其中连接红黑树和容器的是迭代器,map set 暴露出的接口都不是自己写的,而是红黑树写的,外部接口封装红黑树接口。 所以写出红黑树为 map set 写的接口,再在上层的…...
巧用 Cursor+Coze,轻松简化小程序开发
一、为啥要用 Cursor+Coze 简化小程序开发 家人们,如今小程序简直火出圈啦!不管你是电商从业者,还是服务行业的工作者,又或是自媒体运营者,拥有一个小程序,就相当于给业务插上了腾飞的翅膀,能带来更多的流量和机会。但是,小程序开发的过程,那可真是充满了挑战。从最开…...
如何获取sql数据中时间的月份、年份(类型为date)
可用自带的函数month来实现 如: 创建表及插入数据: create table test (id int,begindate datetime) insert into test values (1,2015-01-01) insert into test values (2,2015-02-01) 执行sql语句,获取月份: select MONTH(begindate)…...
NSSCTF Pwn [NISACTF 2022]ezpie 题解
下载 exeinfo checksec 32位 NX PIE开启 查看main函数: 后门函数: 发现已经给出了main函数地址 因为开启了PIE 所以IDA中 后门函数减去main函数的后三位就是偏移 给出的函数加上这个数就是后门函数地址 exp: from pwn import *p remote(…...
数据结构与算法——二分查找
二分查找算法常用于在具有单调性的数组中,以logn的时间复杂度快速查找某个目标值是否存在于该数组中,如果存在还能够返回目标值在数组中的索引下标,常见的二分查找算法有开区间写法、半开区间写法以及闭区间写法,这三种写法的区别…...
【01】共识机制
BTF共识 拜占庭将军问题 拜占庭将军问题是一个共识问题 起源 Leslie Lamport在论文《The Byzantine Generals Problem》提出拜占庭将军问题。 核心描述 军中可能有叛徒,却要保证进攻一致,由此引申到计算领域,发展成了一种容错理论。随着…...
文字加持:让 OpenCV 轻松在图像中插上文字
前言 在很多图像处理任务中,我们不仅需要提取图像信息,还希望在图像上加上一些文字,或是标注,或是动态展示。正如在一幅画上添加一个标语,或者在一个视频上加上动态字幕,cv2.putText 就是这个“文字魔术师”,它能让我们的图像从“沉默寡言”变得生动有趣。 今天,我们…...
【R语言】环境空间
一、环境空间的特点 环境空间是一种特殊类型的变量,它可以像其它变量一样被分配和操作,还可以以参数的形式传递给函数。 R语言中环境空间具有如下3个特点: 1、对象名称唯一性 此特点指的是在不同的环境空间中可以有同名的变量出现&#x…...
惰性函数【Ⅱ】《事件绑定的自我修养:从青铜到王者的进化之路》
【Ⅱ】《事件绑定的自我修养:从青铜到王者的进化之路》 1. 代码功能大白话(给室友讲明白版) // 青铜写法:每次都要问浏览器"你行不行?" function addEvent青铜版(element, type, handler) {if (window.add…...
Vue3的el-table-column下拉输入实时查询API数据选择的实现方法
由于本人对el-table-column有下拉输入选择的要求,根据网上搜索的资料及本人优化,推出我比较满意的方法,供各位读者参考使用。 效果图 el-table-column写法 <el-table-columnlabel"货品编号"align"center"prop"…...
[mmdetection]fast-rcnn模型训练自己的数据集的详细教程
本篇博客是由本人亲自调试成功后的学习笔记。使用了mmdetection项目包进行fast-rcnn模型的训练,数据集是自制图像数据。废话不多说,下面进入训练步骤教程。 注:本人使用linux服务器进行展示,Windows环境大差不差。另外࿰…...
#systemverilog# Verilog与SystemVerilog发展历程及关系
1. Verilog的发展历史 1984年:Gateway Design Automation公司开发了Verilog,最初作为专有语言,用于逻辑仿真和数字电路设计。 1990年:Cadence收购Gateway,Verilog逐步开放,成为行业标准。 1995年(IEEE 1364-1995):首个IEEE标准,即Verilog-1995,定义基础语法和仿真语…...
RFID涉密载体管控系统|支持国产化、自主研发
涉密载体管理系统DW-S402是一套成熟系统,是用于对各种涉密载体进行有效管理,实现对载体的智能化、规范化、标准化管理,广泛应用于保密、机要单位以及企事业单位等有载体保管需求的行业。 用户为对文件资料、存储介质等管理严格的单位&#x…...
BUU14 [极客大挑战 2019]PHP1
用dirsearch扫描文件,扫了一万年什么也没扫出来 从网上看的wp,他们扫出来www.zip 这里直接用上了,以后有空再扫一遍 下载www.zip 在index.php中 说明要输入select 打开class.php <?php include flag.php;error_reporting(0);class…...
数据分析师使用Kutools for Excel 插件
数据分析师使用Kutools for Excel 插件 Kutools for Excel 是一款功能强大的 Excel 插件,旨在提高 Excel 用户的工作效率,简化复杂的操作。它提供了超过 300 个增强功能,帮助用户快速完成数据管理、格式化、排序、分析等任务,特别…...
【高级篇 / IPv6】(7.2) ❀ 04. 在60E上配置ADSL拨号宽带上网(IPv4) ❀ FortiGate 防火墙
【简介】除了单位用户以外,大部分个人用户目前使用的仍然是30E、50E、60E系列防火墙,固件无法达到目前最高版本7.6,这里以最常用的60E为例,演示固件版本7.2下实现ADSL拨号宽带的IPv6上网。由于内容比较多,文章分上、下…...
基于LMS算法的自适应滤波器设计与MATLAB实现
1. 引言 自适应滤波器是信号处理领域的重要工具,能够根据输入信号的统计特性自动调整滤波器参数。其中,最小均方(LMS)算法因其计算简单、易于实现的特点,成为最常用的自适应滤波算法之一,广泛应用于噪声消…...
【现代深度学习技术】深度学习计算 | 延后初始化自定义层
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
LeetCode 3105. Longest Strictly Increasing or Strictly Decreasing Subarray
🔗 https://leetcode.com/problems/longest-strictly-increasing-or-strictly-decreasing-subarray 题目 给一个数组,返回其最长严格升序或者降序的子数组长度 思路 模拟 代码 class Solution { public:int longestMonotonicSubarray(vector<in…...
Java导出Excel简单工具类
一、maven配置 <!--jxl--><dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.12</version></dependency>二、工具类方法 package util2;import jxl.Workbook; impor…...
蓝桥与力扣刷题(141 环形链表)
题目:给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的…...
【小鱼闪闪】做一个物联网控制小灯的制作流程简要介绍(图文)
1、注册物联网云平台,这里选用巴法云 2.、新建主题 “ledtest” 3、 使用Arduino或Mixly软件编写单片机程序(需要引用巴法云库文件),程序中订阅“ledtest”主题,用于接收单片机发送来的数据。此处会将连接的温度传感器…...
图论常见算法
图论常见算法 算法prim算法Dijkstra算法 用途最小生成树(MST):最短路径:拓扑排序:关键路径: 算法用途适用条件时间复杂度Kruskal最小生成树无向图(稀疏图)O(E log E)Prim最小生成树无…...
实战技巧:如何快速提高网站收录的权威性?
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/68.html 快速提高网站收录的权威性是一个系统性的工作,涉及内容质量、网站结构、外部链接、用户体验等多个方面。以下是一些实战技巧,可以帮助你快速提升网站收录的权…...
