精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一聊 C# 弱引用底層是怎么玩的

開發 前端
WeakReference 的內部玩法有很多,更深入的理解還需要對 g_HandleTableMap 進行深度挖掘,后面有機會再聊吧,有時候dump分析還是挺苦逼的,需要對相關領域底層知識有一個足夠了解,否則談何修復呢?

一、背景

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 = (trackResurrection ? (num | 1) : num);
    ComAwareWeakReference.ComInfo comInfo = ComAwareWeakReference.ComInfo.FromObject(target);
    if (comInfo != null)
    {
        ComAwareWeakReference.SetComInfoInConstructor(ref _taggedHandle, comInfo);
    }
}

public enum GCHandleType
{
    //
    // Summary:
    //     This handle type is used to track an object, but allow it to be collected. When
    //     an object is collected, the contents of the System.Runtime.InteropServices.GCHandle
    //     are zeroed. Weak references are zeroed before the finalizer runs, so even if
    //     the finalizer resurrects the object, the Weak reference is still zeroed.
    Weak = 0,
    //
    // Summary:
    //     This handle type is similar to System.Runtime.InteropServices.GCHandleType.Weak,
    //     but the handle is not zeroed if the object is resurrected during finalization.
    WeakTrackResurrection = 1
}

從上面的 GCHandleType 的注釋來看。

  • Weak 會在終結器執行之前判斷持有的對象是否為垃圾對象,如果是的話直接切斷引用。
  • WeakTrackResurrection 會在終結器執行之后判斷對象是否為垃圾對象,如果是的話直接切斷引用。

可能這么說有點抽象,畫張圖如下:

圖片圖片

2. 一個簡單的測試例子

為了方便講述兩者的區別,使用 對象復活 來做測試。

  • Weak 的情況

因為在 ScanForFinalization 方法之前做的判斷,所以與垃圾對象的聯系會被馬上切斷,參考代碼如下:

class Program
    {
        static void Main()
        {
            WeakReferenceCase();

            GC.Collect();
            GC.WaitForPendingFinalizers();

            Console.WriteLine(weakHandle.Target ?? "Person 引用被切斷");

            Console.ReadLine();
        }

        public static GCHandle weakHandle;

        static void WeakReferenceCase()
        {
            var person = new Person() { ressurect = false };
            weakHandle = GCHandle.Alloc(person, GCHandleType.Weak);
        }
    }

    public class Person
    {
        public bool ressurect = false;

        ~Person()
        {
            if (ressurect)
            {
                Console.WriteLine("Person 被永生了,不可能被消滅的。。。");
                GC.ReRegisterForFinalize(this);
            }
            else
            {
                Console.WriteLine("Person 析構已執行...");
            }
        }
    }

圖片圖片

  • WeakTrackResurrection 的情況

因為是在 ScanForFinalization 之后做的判斷,這時候可能會存在 對象復活 的情況,所以垃圾又變成不垃圾了,如果是這種情況就不能切斷,參考代碼如下:

static void WeakReferenceCase()
{
    var person = new Person() { ressurect = true };
    weakHandle = GCHandle.Alloc(person, GCHandleType.WeakTrackResurrection);
}

圖片圖片

3. coreclr源碼分析

在 coreclr 里有一個 struct 枚舉強對應 GCHandleType 結構體,而且名字看的更加清楚,代碼如下:

typedef enum
{
 HNDTYPE_WEAK_SHORT = 0,
 HNDTYPE_WEAK_LONG = 1,
}
HandleType;

接下來看下剛才截圖源碼上的驗證。

void gc_heap::mark_phase(int condemned_gen_number, BOOL mark_only_p)
{
 // null out the target of short weakref that were not promoted.
 GCScan::GcShortWeakPtrScan(condemned_gen_number, max_generation, &sc);

 dprintf(3, ("Finalize marking"));
 finalize_queue->ScanForFinalization(GCHeap::Promote, condemned_gen_number, mark_only_p, __this);

 // null out the target of long weakref that were not promoted.
 GCScan::GcWeakPtrScan(condemned_gen_number, max_generation, &sc);
}

BOOL CFinalize::ScanForFinalization(promote_func* pfn, int gen, BOOL mark_only_p, gc_heap* hp)
{
    for (unsigned int Seg = startSeg; Seg <= gen_segment(0); Seg++)
    {
        Object** endIndex = SegQueue(Seg);
        for (Object** i = SegQueueLimit(Seg) - 1; i >= endIndex; i--)
        {
            CObjectHeader* obj = (CObjectHeader*)*i;

            if (!g_theGCHeap->IsPromoted(obj))
            {
                if (method_table(obj)->HasCriticalFinalizer())
                {
                    MoveItem(i, Seg, CriticalFinalizerListSeg);
                }
                else
                {
                    MoveItem(i, Seg, FinalizerListSeg);
                }
            }
        }
    }

    if(finalizedFound) GCToEEInterface::EnableFinalization(true);

    return finalizedFound;
}

源碼中有幾個注意點:

  • 如何判斷一個對象為垃圾

gc 在標記時,將有根的對象mt的第一位設為 1 來表示當前已經標記過,即有用對象,未被標記的即為垃圾對象。

  • 終結器線程真的被啟動了嗎

從簡化的源碼看,一旦有垃圾對象被送入到 終結器隊列的 預備區 時,就會通過 GCToEEInterface::EnableFinalization(true) 啟動終結器線程,所以在測試代碼中加了 GC.WaitForPendingFinalizers(); 就是為了等待終結器線程執行完畢然后才判斷 Target,這樣結果就會更加準確。

4. 切斷邏輯在哪里

有些朋友會好奇那個 weakHandle.Target=null 的邏輯到底在 coreclr 的何處,這個比較簡單,可以用 windbg 下 ba 斷點即可,我們還是拿弱引用來舉例,截圖如下:

圖片圖片

三、總結

WeakReference 的內部玩法有很多,更深入的理解還需要對 g_HandleTableMap 進行深度挖掘,后面有機會再聊吧,有時候dump分析還是挺苦逼的,需要對相關領域底層知識有一個足夠了解,否則談何修復呢?

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2025-01-10 08:15:22

C#異步底層

2024-08-26 14:46:57

2021-03-29 00:02:10

C#Attribute元素

2024-12-26 10:05:58

C#前臺線程

2021-06-29 08:45:55

邏輯變量法函數

2023-03-05 18:40:39

iptables防火墻軟件

2023-10-24 15:56:23

2022-08-30 07:39:57

C++namespace隔離

2020-10-30 07:11:31

C 語言編程

2024-10-08 10:55:04

2022-11-02 08:51:01

2023-12-07 07:26:04

2024-01-02 13:26:39

TLSC#線程

2020-10-23 07:00:00

C++函數

2020-09-08 06:54:29

Java Gradle語言

2023-07-06 13:56:14

微軟Skype

2018-03-22 10:36:15

未來數據中心停機

2018-06-07 13:17:12

契約測試單元測試API測試

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

點贊
收藏

51CTO技術棧公眾號

91精品国产综合久久香蕉最新版 | 欧美.com| 夜夜揉揉日日人人青青一国产精品| 国产精品国产三级欧美二区| 久久影视中文字幕| 久久精品影视| 亚洲激情视频在线播放| 日本激情视频在线播放| 免费电影网站在线视频观看福利| 99精品国产视频| 国产主播欧美精品| 亚洲免费激情视频| 国产精品不卡| 亚洲老板91色精品久久| 操人视频免费看| 中文一区一区三区高中清不卡免费| 中文字幕精品综合| 国产一区二区三区四区五区在线| 在线免费观看一级片| 91久久午夜| y97精品国产97久久久久久| 中文字幕精品久久久| 亚洲人体在线| 色呦呦日韩精品| 青青青在线视频播放| 欧美一区二区三区在线观看免费| 99国产精品国产精品毛片| 91亚洲精品一区| www.久久网| 欧美综合国产| 97精品一区二区三区| www青青草原| 久久综合99| 亚洲欧美精品suv| 中文字幕乱视频| 国产亚洲观看| 777xxx欧美| 亚洲36d大奶网| 欧美粗大gay| 欧美性猛交xxxx富婆弯腰| 日本福利视频网站| 91在线中字| 最新不卡av在线| 亚洲欧洲日夜超级视频| 国产玉足榨精视频在线观看| 26uuu精品一区二区在线观看| 成人免费在线一区二区三区| 国产乱码一区二区| 免费成人在线网站| 国产精品一区久久久| 中文字幕av片| 美女脱光内衣内裤视频久久网站 | 天堂中文在线网| 99精品视频免费| 欧美精品福利在线| 久久免费小视频| 国产综合网站| 韩国日本不卡在线| 91国产丝袜播放在线| 在线看片一区| 4k岛国日韩精品**专区| 亚洲黄色一区二区| 亚洲一区二区三区免费在线观看| 97视频在线免费观看| 日本道在线观看| 亚洲欧美日韩国产综合精品二区| 欧美一级bbbbb性bbbb喷潮片| 日韩精品1区2区| 久久久久久久波多野高潮日日| 日韩美女毛茸茸| 最近中文字幕免费在线观看| 久久综合综合久久综合| 成人亚洲激情网| www.av在线.com| 波多野结衣中文字幕一区二区三区| 国产在线欧美日韩| 国内精品一区视频| 国产精品久久久久久久久晋中| 国产高清免费在线| 日韩特级毛片| 欧美日韩免费在线观看| 9久久婷婷国产综合精品性色 | 国产亚洲激情| 国产成人亚洲综合| 91禁在线观看| 成人免费高清视频| 日韩高清dvd| av网址在线看| 精品久久香蕉国产线看观看亚洲 | 国产精品一区二区黑丝| 国产欧美一区二区三区不卡高清| 欧洲天堂在线观看| 综合中文字幕亚洲| 青青青国产在线观看| 素人啪啪色综合| 日韩免费一区二区| 国产jjizz一区二区三区视频| 日韩综合一区| 国模私拍视频一区| 一区二区视频免费观看| 国产成人三级在线观看| 麻豆精品传媒视频| 99视频免费在线观看| 一本到一区二区三区| 一级黄色片在线免费观看| 日韩高清在线免费观看| www.亚洲成人| 丰满人妻老熟妇伦人精品| 精品一区二区三区久久| 欧美日韩精品久久| 免费在线国产视频| 欧美日韩国产片| 性欧美丰满熟妇xxxx性久久久| 久久精品国产亚洲夜色av网站| 午夜精品一区二区三区在线| 一级黄色大片免费| 波多野洁衣一区| 一级黄色录像免费看| 成人影院大全| 亚洲国产欧美一区二区丝袜黑人| 秋霞欧美一区二区三区视频免费 | 亚洲精品老司机| 九九视频精品在线观看| 欧美日韩一区二区三区四区不卡 | 国产精品99久久久久久有的能看| 欧美一级爱爱| 小视频免费在线观看| 欧美白人最猛性xxxxx69交| 91无套直看片红桃在线观看| 鲁大师成人一区二区三区| 国产精品久久久久av福利动漫| 黄色免费在线看| 欧美亚洲日本一区| 欧美高清性xxxx| 亚洲国产免费| 高清免费日韩| 日韩三级电影视频| 日韩欧美电影在线| 国产suv一区二区三区| 六月婷婷色综合| 亚洲国产激情一区二区三区| 欧美羞羞视频| 亚洲美腿欧美激情另类| 成人午夜视频精品一区| 波多野洁衣一区| 2019日韩中文字幕mv| 日本精品视频| 久久综合亚洲社区| 99久久久无码国产精品免费| 亚洲日本护士毛茸茸| 亚洲精品mv在线观看| 91精品国偷自产在线电影| 国产欧美精品久久久| 2019中文字幕在线视频| 欧美色视频在线观看| 亚洲а∨天堂久久精品2021| 日韩成人免费看| 日本在线成人一区二区| 国产成人精品一区二区三区免费| 中文字幕欧美视频在线| 91theporn国产在线观看| 国产精品久久夜| 手机精品视频在线| 欧美精品一线| 国模精品娜娜一二三区| 一区二区精品伦理...| 亚洲欧美中文字幕在线一区| 成人小视频在线播放| 国产精品麻豆久久久| 黄色小视频免费网站| 亚洲国产成人精品女人| 91免费在线观看网站| 超碰中文在线| 亚洲人成免费电影| 伊人亚洲综合网| 亚洲精品v日韩精品| 亚洲精品激情视频| 久久成人亚洲| 一级特黄妇女高潮| 久久久亚洲欧洲日产| 国产精品第一第二| 成人福利片网站| 亚洲级视频在线观看免费1级| 中文字幕日韩免费| 日韩一区中文字幕| 成人免费看片载| 久久狠狠婷婷| 9l视频自拍9l视频自拍| 久久九九热re6这里有精品| 国产精品成人av性教育| 18av在线播放| 亚洲夜晚福利在线观看| 亚洲av色香蕉一区二区三区| 日韩欧美精品网站| 日韩福利小视频| 91小视频在线| 国产精品久久久久野外| 久久精品人人做人人爽电影蜜月| 国产人妻互换一区二区| 香蕉久久精品| 99国产视频在线| 欧美黄色三级| 性视频1819p久久| 免费黄色电影在线观看| 亚洲精品中文字| 精品二区在线观看| 精品视频一区二区不卡| 免费毛片一区二区三区| 成人欧美一区二区三区小说| 精品国产无码在线观看| 国产福利一区二区三区视频 | 日韩成人在线播放| 国产三级小视频| 在线观看一区二区精品视频| 久久精品欧美一区二区| 国产精品乱码久久久久久| 日本黄色录像片| 国产乱码精品1区2区3区| 北条麻妃视频在线| 国产一区二区三区久久久久久久久| 自拍偷拍99| 日韩国产欧美一区二区| 另类小说综合网| 国产成人高清精品免费5388| 91精品综合久久久久久五月天| 欧洲一区精品| 国外成人在线视频| 伊人精品影院| 久久精品国产视频| av福利精品| 亚洲一区999| 毛片网站在线观看| 亚洲精品国产精品自产a区红杏吧| 国产黄色免费大片| 337p亚洲精品色噜噜噜| 国产成人精品一区二区色戒| 欧美午夜激情在线| 五月激情六月丁香| 婷婷综合另类小说色区| 日韩无码精品一区二区三区| 一区二区三区高清| 欧美日韩成人免费观看| 一区二区日韩电影| 欧美黄色免费观看| 亚洲欧美电影一区二区| 三上悠亚作品在线观看| 中文字幕一区二区视频| 国精产品视频一二二区| 亚洲欧洲日韩一区二区三区| 欧美自拍偷拍网| 中文字幕欧美一| 成人在线观看免费完整| 亚洲精品免费看| 久久亚洲成人av| 亚洲国产裸拍裸体视频在线观看乱了| 国产一级片久久| 午夜久久久影院| 久久狠狠高潮亚洲精品| 狠狠躁夜夜躁人人爽超碰91| 国产精品久久久久久久妇| 欧美日韩综合视频| 无码人妻精品一区二区| 欧美午夜片在线看| 91国产免费视频| 日韩免费观看高清完整版 | 成人小视频免费在线观看| 国产黑丝一区二区| 99久久er热在这里只有精品66| av网站有哪些| 欧美高清一级片在线观看| 乱老熟女一区二区三区| 亚洲欧美经典视频| 国产成人在线播放视频| 在线免费观看视频一区| 夜夜嗨aⅴ一区二区三区| 日韩欧美亚洲另类制服综合在线| 丰满肥臀噗嗤啊x99av| 亚洲欧美日韩国产中文| 成人性生交大片免费看午夜| 不卡伊人av在线播放| heyzo一区| 国产精品视频免费在线观看| 欧美a级大片在线| 精品综合久久| 久久精品影视| 亚洲熟妇av一区二区三区漫画| 久久不射网站| 性鲍视频在线观看| 久久综合九色综合97婷婷女人| 青青青手机在线视频| 亚洲一区视频在线观看视频| 成年人av网站| 欧美va日韩va| 高清国产福利在线观看| 欧美寡妇偷汉性猛交| 亚洲伦乱视频| 成人三级在线| 日韩中文欧美| 高清在线观看免费| 国产乱人伦偷精品视频免下载| 丰满少妇高潮一区二区| 亚洲精品高清视频在线观看| 波多野结衣视频观看| 亚洲大胆美女视频| 日本高清在线观看wwwww色| 97精品国产91久久久久久| 亚洲精品成a人ⅴ香蕉片| 久久精品二区| 欧美激情五月| 中文字幕有码av| 99久久婷婷国产综合精品电影| 日本黄色录像视频| 欧美视频在线观看免费| 亚洲精品综合久久| 日韩有码视频在线| 爱情电影社保片一区| 成人综合色站| 亚洲国产精品成人| 国产精品一区二区小说| 99久久免费精品| 久久亚洲成人av| 日韩亚洲欧美成人一区| 欧美成人三区| 国产精品国产三级国产专播精品人| 超碰cao国产精品一区二区| 国产高清精品软男同| 日本怡春院一区二区| 蜜桃精品成人影片| 午夜久久久影院| 日本黄色不卡视频| 欧美精品日韩三级| 99热这里有精品| 一区二区三区四区国产| 视频在线观看91| 中文字幕丰满孑伦无码专区| 欧美日韩国产激情| 欧美少妇bbw| 亚州精品天堂中文字幕| 亚洲天堂av资源在线观看| 水蜜桃在线免费观看| 国产一区二区在线观看视频| 麻豆视频免费在线播放| 欧美日韩免费在线视频| av在线电影网| 国产欧美精品一区二区三区介绍| 成人久久综合| 一级黄色特级片| 亚洲欧美一区二区三区极速播放| 亚洲中文字幕一区二区| 日韩中文字在线| av在线精品| 黄色a级片免费看| 99久久免费精品高清特色大片| 亚洲一区欧美在线| 精品亚洲va在线va天堂资源站| 日韩精品美女| 秋霞毛片久久久久久久久| 日韩影院免费视频| 三级黄色免费观看| 91精品免费观看| 3344国产永久在线观看视频| 久久av免费一区| 日韩av在线发布| 天堂网av2018| 日韩欧美国产综合| 欧美freesex黑人又粗又大| 欧美精品一区二区三区四区五区| 日本亚洲视频在线| 午夜爽爽爽男女免费观看| 欧美成人性战久久| 天堂av在线网| 亚洲综合第一| 成人永久看片免费视频天堂| 毛片在线免费视频| 中国日韩欧美久久久久久久久| 国产精品美女久久久久人| 好吊妞无缓冲视频观看| 国产欧美日韩综合| 国产口爆吞精一区二区| 97免费中文视频在线观看| 国产精品片aa在线观看| 两性午夜免费视频| 欧美日韩免费看| 国产高清一区二区三区视频 | 欧美色图国产精品| 欧美视频亚洲图片| 精品日本美女福利在线观看| 97最新国自产拍视频在线完整在线看| 亚洲r级在线观看| 久久国产99| 中文字幕另类日韩欧美亚洲嫩草| 精品网站999www| 精品国产18久久久久久二百| 精品少妇人妻av免费久久洗澡| 中日韩av电影| 熟妇高潮一区二区高潮| 国产精品中文在线| 国产亚洲综合精品| 中文字幕在线观看2018| 亚洲欧美国产一区二区三区|