日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-06-28 17:09:52 228觀看
導讀一、背景1. 講故事最近在分析dump時,發現有程序的卡死和WeakReference有關,在以前只知道怎么用,但不清楚底層邏輯走向是什么樣的,借著這個dump的契機來簡單研究下。二、弱引用的玩法1. 一些基礎概念用過WeakReference的朋

一、背景

1. 講故事

最近在分析dump時,發現有程序的卡死和WeakReference有關,在以前只知道怎么用,但不清楚底層邏輯走向是什么樣的,借著這個dump的契機來簡單研究下。qzM28資訊網——每日最新資訊28at.com

二、弱引用的玩法

1. 一些基礎概念

用過WeakReference的朋友都知道這里面又可以分為弱短和弱長兩個概念,對應著構造函數中的trackResurrection參數,同時它也是對底層GCHandle.Alloc 方法的封裝,參考源碼如下:qzM28資訊網——每日最新資訊28at.com

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 的注釋來看。qzM28資訊網——每日最新資訊28at.com

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

可能這么說有點抽象,畫張圖如下:qzM28資訊網——每日最新資訊28at.com

圖片圖片qzM28資訊網——每日最新資訊28at.com

2. 一個簡單的測試例子

為了方便講述兩者的區別,使用 對象復活 來做測試。qzM28資訊網——每日最新資訊28at.com

  • Weak 的情況

因為在 ScanForFinalization 方法之前做的判斷,所以與垃圾對象的聯系會被馬上切斷,參考代碼如下:qzM28資訊網——每日最新資訊28at.com

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 析構已執行...");            }        }    }

圖片圖片qzM28資訊網——每日最新資訊28at.com

  • WeakTrackResurrection 的情況

因為是在 ScanForFinalization 之后做的判斷,這時候可能會存在 對象復活 的情況,所以垃圾又變成不垃圾了,如果是這種情況就不能切斷,參考代碼如下:qzM28資訊網——每日最新資訊28at.com

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

圖片圖片qzM28資訊網——每日最新資訊28at.com

3. coreclr源碼分析

在 coreclr 里有一個 struct 枚舉強對應 GCHandleType 結構體,而且名字看的更加清楚,代碼如下:qzM28資訊網——每日最新資訊28at.com

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

接下來看下剛才截圖源碼上的驗證。qzM28資訊網——每日最新資訊28at.com

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;}

源碼中有幾個注意點:qzM28資訊網——每日最新資訊28at.com

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

gc 在標記時,將有根的對象mt的第一位設為 1 來表示當前已經標記過,即有用對象,未被標記的即為垃圾對象。qzM28資訊網——每日最新資訊28at.com

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

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

4. 切斷邏輯在哪里

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

圖片圖片qzM28資訊網——每日最新資訊28at.com

三、總結

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

本文鏈接:http://m.www897cc.com/showinfo-26-97278-0.html聊一聊 C# 弱引用底層是怎么玩的

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 十個 Python 秘訣將顛覆你的編碼方式

下一篇: 為什么會 Js 但是依然不會寫 Node?原因竟是這三點...

標簽:
  • 熱門焦點
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構建引擎,用于在.NET Framework和.NET Core應用程序中自動化構建過程。它是Visual Studio的構建引擎,可在命令行或其他構建工具中使用
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • iQOO 11S評測:行業唯一的200W標準版旗艦

    【Techweb評測】去年底,iQOO推出了“電競旗艦”iQOO 11系列,作為一款性能強機,該機不僅全球首發2K 144Hz E6全感屏,搭載了第二代驍龍8平臺及144Hz電競
  • 聯想YOGA 16s 2022筆記本將要推出,屏幕支持觸控功能

    聯想此前宣布,將于11月2日19:30召開聯想秋季輕薄新品發布會,推出聯想 YOGA 16s 2022 筆記本等新品。官方稱,YOGA 16s 2022 筆記本將搭載 16 英寸屏幕,并且是一
  • 利用職權私自解除被封帳號 Meta開除20多名員工

    11月18日消息,據外媒援引知情人士表示,過去一年時間內,Facebook母公司Meta解雇或處罰了20多名員工以及合同工,指控這些人通過內部系統以不當方式重置用戶帳號,其
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美高清在线观看| 亚洲美女精品成人在线视频| 国产精品爽爽爽| 国产日韩av一区二区| 加勒比av一区二区| 99re这里只有精品6| 亚洲欧美国产视频| 久久一综合视频| 欧美金8天国| 国产精品久久久久9999吃药| 国产又爽又黄的激情精品视频| 亚洲观看高清完整版在线观看| 亚洲黄色在线看| 亚洲无线观看| 久久综合五月天婷婷伊人| 欧美另类一区| 国产一区二区三区自拍 | 国产精品影院在线观看| 尹人成人综合网| 亚洲视频观看| 鲁鲁狠狠狠7777一区二区| 欧美三级在线| 亚洲成人在线网| 亚洲欧美日韩国产中文在线| 蜜桃伊人久久| 国产麻豆午夜三级精品| 91久久香蕉国产日韩欧美9色 | 乱码第一页成人| 国产精品99免费看 | 美女在线一区二区| 国产精品免费网站| 最近中文字幕mv在线一区二区三区四区 | 欧美大片一区二区三区| 国产免费观看久久| 亚洲美女精品一区| 久久字幕精品一区| 国产精品美女主播| 久久先锋资源| 国产精品久久久久免费a∨| 亚洲激情专区| 久久精品国产2020观看福利| 欧美视频在线免费| 亚洲第一区在线观看| 校园春色国产精品| 欧美三级韩国三级日本三斤| 在线免费观看欧美| 欧美一区二区三区免费观看| 欧美日韩在线播放一区| 亚洲国产精品久久久久婷婷老年| 欧美影院午夜播放| 国产精品扒开腿爽爽爽视频| 亚洲精品国产精品久久清纯直播| 久久久青草婷婷精品综合日韩 | 国产精品久久久久久久9999 | 久久久人人人| 国产一区二区剧情av在线| 亚洲午夜av在线| 欧美激情女人20p| 伊大人香蕉综合8在线视| 欧美在线看片a免费观看| 国产精品美女久久久| 亚洲色在线视频| 欧美日韩国产123区| 亚洲激情欧美激情| 老司机免费视频一区二区| 国内外成人免费视频| 欧美在线亚洲| 国产欧美精品在线播放| 亚洲综合视频一区| 国产精品盗摄久久久| 日韩视频精品在线| 欧美国产一区视频在线观看| 1024国产精品| 噜噜噜躁狠狠躁狠狠精品视频| 国内综合精品午夜久久资源| 欧美一级视频| 国产情侣久久| 欧美专区第一页| 国产伦精品一区二区| 中文av字幕一区| 欧美日韩一区在线观看| 一本色道久久综合亚洲精品婷婷| 欧美精品不卡| 一本久久a久久精品亚洲| 欧美日韩1区2区| 日韩视频一区二区三区在线播放免费观看 | 亚洲福利视频专区| 每日更新成人在线视频| 亚洲电影成人| 欧美成人免费视频| 91久久精品一区| 欧美黄色网络| 亚洲免费观看在线视频| 欧美日韩国产小视频在线观看| 国产精品区二区三区日本| 亚洲一区综合| 国产伦精品一区二区三区高清| 亚洲欧美日韩久久精品| 国产精品视频一二三| 欧美一区二区| 红桃视频亚洲| 欧美波霸影院| 99精品热6080yy久久| 欧美午夜激情在线| 亚洲综合精品| 国产日韩精品在线| 久久久久久久91| 在线视频观看日韩| 欧美激情精品久久久久久黑人| 亚洲久久成人| 国产精品盗摄一区二区三区| 性欧美暴力猛交69hd| 狠狠色2019综合网| 欧美成人一区二区三区| 美女精品在线| 欧美日韩在线三区| 欧美午夜不卡在线观看免费 | 日韩亚洲在线观看| 国产欧美日韩一区| 亚洲精品字幕| 亚洲一区二区三区午夜| 91久久久在线| aa国产精品| 久久国产精品亚洲77777| 中文亚洲视频在线| 久久久99国产精品免费| 欧美激情免费在线| 亚洲国产黄色| 欧美电影资源| 国产精品国产三级国产普通话三级 | 亚洲精品国偷自产在线99热| 伊人久久亚洲影院| 国产日韩精品视频一区| 国产色产综合色产在线视频| 国产精品一区一区三区| 在线观看日韩欧美| 亚洲国产aⅴ天堂久久| 久久av最新网址| 欧美午夜激情视频| 日韩亚洲不卡在线| 中文av一区二区| 亚洲欧美视频一区| 99国产精品国产精品久久| 免费久久99精品国产| 激情国产一区| 一区二区三区高清不卡| 性欧美videos另类喷潮| 国内精品久久久久影院色| 久久精品成人欧美大片古装| 国产精品久久91| 国产精品欧美精品| 亚洲国产成人精品视频| 亚洲韩日在线| 亚洲女女做受ⅹxx高潮| 欧美影院在线播放| 欧美激情精品| 欧美另类女人| 亚洲人成人一区二区三区| 亚洲一区国产视频| 久久精品中文字幕一区| 欧美日韩亚洲高清| 在线观看欧美日本| 狂野欧美激情性xxxx| 国产精品人成在线观看免费 | 国产精品久久久久9999| 亚洲第一精品久久忘忧草社区| 性欧美videos另类喷潮| 极品少妇一区二区三区精品视频 | 欧美日韩亚洲91| 欧美制服丝袜第一页| 伊人狠狠色j香婷婷综合| 欧美日韩高清区| 久久精品一区二区国产| 99天天综合性| 一区二区视频免费在线观看 | 国产精品国产三级国产aⅴ入口| 欧美一区二区精品| 99av国产精品欲麻豆| 国产一区二区精品| 一区二区三区亚洲| 午夜精品在线观看| 亚洲九九爱视频| 一色屋精品视频在线观看网站| 国产精品免费看久久久香蕉| 欧美日韩成人在线视频| 巨乳诱惑日韩免费av| 亚洲国产电影| 久久天天狠狠| 性色一区二区三区| 国产伦精品一区二区| 洋洋av久久久久久久一区| 欧美午夜精品理论片a级按摩| 国产精品福利在线观看网址| 国产综合av| 午夜精品免费在线| 欧美日韩精品一区二区天天拍小说 | 久久国产一区| 亚洲图片自拍偷拍| 99国产精品久久久久久久久久| 亚洲国产日韩在线| 亚洲成色最大综合在线| 一区在线观看| 一区二区亚洲| 尤物yw午夜国产精品视频明星|