一:背景
1. 讲故事
最近在分析dump时,发现有程序的卡死和WeakReference
有关,在以前只知道怎么用,但不清楚底层逻辑走向是什么样的,借着这个dump的契机来简单研究下。
二:弱引用的玩法
1. 一些基础概念
用过WeakReference的朋友都知道这里面又可以分为弱短
和弱长
两个概念,对应着构造函数中的trackResurrection
参数,同时它也是对底层GCHandle.Alloc
方法的封装,参考源码如下:
public WeakReference(object? target, bool trackResurrection)
{
Create(target, trackResurrection);
}
private void Create(object target, bool trackResurrection)
{
nint num = GCHandle.InternalAlloc(target, trackResurrection ? GCHandleType.WeakTrackResurrection : GCHandleType.Weak);
_taggedHandle = (trackResurrecti