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有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象 ...
随机推荐
- QT5笔记: 35. QGraphicsView 视图
 三者关系:View中可以有多个Scene,Scene放在Vi ...
- Vulnhub-Node
利用信息收集拿到路径得到账户密码,下载备份文件,base64解密后,利用fcrackzip爆破zip压缩包,得到一个文件,查看app.js,发现泄露的账户密码,连接ssh,成功连接,利用ubuntu历 ...
- python 二级 第三方库
爬虫:rs 1.requests:链接访问 2.scrapy:系统构建.数据挖掘.网络监控.自动化 数据分析方向 nsp 1.numpy :数组 .科学计算.c语言编写 2.scipy:科学.数学.工 ...
- Caused by: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String 解决办法
使用MyBatis 更新数据库数据的时候 遇到了这个错误: Caused by: java.lang.IllegalArgumentException: invalid comparison: jav ...
- libvirt和qga的区别?
本文分享自天翼云开发者社区<libvirt和qga的区别?>,作者:乐道 Libvirt是一个开源项目,提供了一组API.工具.库,用于管理和控制虚拟化平台. 在Openstack环境中, ...
- 在 Go 中恰到好处的内存对齐
问题 type Part1 struct { a bool b int32 c int8 d int64 e byte } 在开始之前,希望你计算一下 Part1 共占用的大小是多少呢? func m ...
- Docker restart 重启容器
就像很多常驻后台应用程序动不动可能就需要重启操作一样,有时候我们可能也需要重启容器 而重启容器使用的就是 docker restart 命令 docker restart <container_ ...
- 【uniapp】文本控件多余文字省略号代替
多余文字使用省略号效果 代码 .l-dd-content{ width: 100%; color: #8b8b8b; display: -webkit-box; /** 对象作为伸缩盒子模型显示 ** ...
- 《机器人SLAM导航核心技术与实战》第1季:第2章_C++编程范式
<机器人SLAM导航核心技术与实战>第1季:第2章_C++编程范式 视频讲解 [第1季]2.第2章_C++编程范式-视频讲解 [第1季]2.1.第2章_C++编程范式-C++工程的组织结构 ...
- Hello, PostgreSQL
Hello, PostgreSQL Whoami:5年+金融.政府.医疗领域工作经验的DBA Certificate:PGCM.OCP.YCP Skill:Oracle.Mysql.PostgreSQ ...