C#中的弱引用
弱引用保持的是一个GC“不可见”的引用,是指弱引用不会增加对象的引用计数,也不会阻止垃圾回收器对该对象进行回收。因此,弱引用的目标对象可以被垃圾回收器回收,而弱引用本身不会对垃圾回收造成任何影响。
弱引用的原理是,在堆上分配的每个对象都有一个头部信息,用于存储对象的类型信息、对象的大小等信息。在头部信息中,还会有一个标志位用于表示对象是否被引用。当一个对象被创建时,该标志位为“未引用”。当该对象被弱引用引用时,该标志位不会变为“已引用”,即该对象仍然会被当做未引用的对象进行处理。被强引用后,会被标记为”已引用“,当所有的强引用都消失时,该标志位会变为“未引用”,即该对象已经没有任何强引用指向它,标记的工作由GC来完成。
在垃圾回收时,GC会根据标记-清除算法对堆中的对象进行扫描和标记,标记所有仍然被引用的对象,然后回收所有未被标记的对象。对于被弱引用引用的对象,由于弱引用不会增加对象的引用计数,也不会阻止垃圾回收器回收该对象,因此在回收时,该对象会被当做未被引用的对象进行处理,然后被回收。
总之,弱引用保持的是一个GC“不可见”的引用,即弱引用不会影响垃圾回收器对目标对象的回收,因此可以用于实现一些场景,例如缓存、对象池等场景,避免长时间占用内存或造成内存泄漏。
var sb = new StringBuilder("weak");
Console.WriteLine("before GC");
Console.WriteLine(sb);
GC.Collect();//强制垃圾回收
Console.WriteLine("after GC");
Console.WriteLine(sb);
Console.ReadLine();
output
before GC
weak
after GC
weak
以下代码在release模式下:
var sb = new StringBuilder("weak");
var weak = new WeakReference(sb);
Console.WriteLine("before GC");
Console.WriteLine(weak.Target);
GC.Collect();
Console.WriteLine("after GC");
if (weak.Target == null)
{
Console.WriteLine("now it has been cleared...");
}
else
{
Console.WriteLine(weak.Target);
}
output:
before GC
weak
after GC
now it has been cleared...
在 debug 模式下,GC.Collect 方法仍然会工作,但是它的行为可能会受到一些影响。
在 debug 模式下,编译器会添加额外的调试信息到代码中,这些信息可能会影响垃圾回收器的行为。例如,编译器可能会保留一些对象的引用,以便调试器可以访问它们,这可能会导致这些对象不会被垃圾回收器回收,直到调试器不再需要它们为止。因此,当调用 GC.Collect 方法时,由于存在调试信息的影响,可能会出现一些对象无法被立即回收的情况。
此外,在 debug 模式下,垃圾回收器的性能也可能会受到一定的影响,因为编译器会添加额外的代码和调试信息,导致程序变得更加复杂和庞大,从而使垃圾回收器需要更长的时间来扫描和回收对象。
因此,如果需要在 debug 模式下进行垃圾回收操作,应该仔细考虑其影响,并进行充分的测试,以确保程序的正确性和性能。同时,还可以考虑使用其他的调试工具和技术来诊断和解决问题,避免对程序的垃圾回收行为产生不必要的影响。
所以,以上代码在debug模式下,会有截然不同的结果:
before GC
weak
after GC
weak
C#中的弱引用的更多相关文章
- 理解Java中的弱引用(Weak Reference)
本篇文章尝试从What.Why.How这三个角度来探索Java中的弱引用,理解Java中弱引用的定义.基本使用场景和使用方法.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指出, ...
- C# 中的弱引用 WeakReference
C#中的弱引用(WeakReference) 我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的.我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET ...
- WeakHashMap<K,V> 中的弱引用
相信很多人对WeakHashMap并没有完全理解. WeakHashMap 持有的弱引用的 Key. 1. 弱引用的概念: 弱引用是用来描述非必需对象的,被弱引用关联的对象只能生存到下一次垃圾收集发生 ...
- 简单说说.Net中的弱引用
弱引用是什么? 要搞清楚什么是弱引用,我们需要先知道强引用是什么.强引用并不是什么深奥的概念,其实我们平时所使用的.Net引用就是强引用.例如: Cat kitty = new Cat(); 变量ki ...
- .NET中的弱引用
弱引用是什么? 要搞清楚什么是弱引用,我们需要先知道强引用是什么.强引用并不是什么深奥的概念,其实我们平时所使用的.Net引用就是强引用.例如: Cat cat = new Cat(); 变量cat就 ...
- 关于C#中的弱引用
本文前部分来自:http://www.cnblogs.com/mokey/archive/2011/11/24/2261605.html 分割线后为作者补充部分. 一:什么是弱引用 了解弱引用之前,先 ...
- Android开发过程中使用弱引用解决内存泄露的习惯
Java虽然有垃圾回收,但是仍然存在内存泄露,比如静态变量.缓存或其他长生命周期的对象引用了其他对象,这些被引用的对象就会长期不能被GC释放,导致内存泄露. 弱引用(WeakReference)是解决 ...
- C#中的弱引用(WeakReference)
我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的.我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET中提供了WeakReference来实现.弱引用可 ...
- Java中的弱引用
Strong references StringBuffer buffer = new StringBuffer(); 普通的对象创建都是这种类型,只要buffer还存在,对象就不会被GC回收.同时也 ...
- 九、Android学习笔记_ Android开发中使用软引用和弱引用防止内存溢出
在<Effective Java 2nd Edition>中,第6条“消除过期的对象引用”提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象 ...
随机推荐
- Flink - [05] 时间语义 & Watermark
题记部分 一.时间语义 Flink中的时间语义分为以下, (1)Event Time:事件创建的时间 (2)Ingestion Time:数据进入Flink的时间 (3)Processing Time ...
- excel 数字转中文大写金额
1.在单元格中输入公式: =SUBSTITUTE(SUBSTITUTE(IF(-RMB(A1,2),TEXT(A1,";负")&TEXT(INT(ABS(A1)+0.5%) ...
- 【论文随笔】会话推荐系统综述(A Survey on Conversational Recommender Systems)
前言 今天读的论文为一篇于2021年5月发表在<ACM计算机调查>(ACM Computing Surveys)的论文,文章提供了对话式推荐系统(CRS)的全面综述,探讨了CRS的定义.概 ...
- [AI/GPT/LLOps/AI中台] Dify : 开源AI大模型应用开发平台(Apache 2.0)
概述:Dify Dify 是一款开源的大语言模型(LLM) 应用开发平台. 它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI ...
- workman PHPSocket.IO文档
安装 请使用composer集成phpsocket.io. 脚本中引用vendor中的autoload.php实现SocketIO相关类的加载.例如 require_once '/你的vendor路径 ...
- CentOS7安装图形界面模式
0.9272019.03.24 15:17:05字数 865阅读 22,115 本人通过VMware14安装Centos7.6过程中出现蓝屏现象,最后发现是因为在系统安装图形界面过程中报错导致,所以决 ...
- 团队小规模本地大模型服务平台搭建 - Windows
实现目标和考虑因素 部署一个支持多用户同时使用.多模型运行的离线局域网大模型服务器 需要考虑以下几个关键因素: 大模型的加载和管理.使用一个基础大模型,根据需要创建多个专用模型,模型管理方便可靠. 并 ...
- ShadowSql之精简版拆分
ShadowSql拆分为精简版和易用版,项目和nuget包同步拆分 ShadowSql项目拆分为ShadowSql.Core和ShadowSql Dapper.Shadow项目拆分为Dapper.Sh ...
- 基于Surprise和Flask构建个性化电影推荐系统:从算法到全栈实现
一.引言:推荐系统的魔法与现实意义 在Netflix每年节省10亿美元内容采购成本的背后,在YouTube占据用户80%观看时长的推荐算法中,推荐系统正悄然改变内容消费模式.本文将带您从零开始构建一个 ...
- 网鼎杯-phpweb
找了一些php读取文件的函数尝试读取源码,试了一个readfile就成功了 <?php $disable_fun = array("exec","shell_exe ...