亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        .NET Framework GC.Keep Alive方法的實(shí)現(xiàn)原理分析

        2021-08-07 11:56:18楊存?zhèn)?/span>
        鄂州大學(xué)學(xué)報(bào) 2021年4期
        關(guān)鍵詞:編譯器調(diào)用示例

        楊存?zhèn)?/p>

        (西南大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)系,重慶 402460)

        在.NET中,內(nèi)存資源分為托管資源和非托管資源,其中托管資源指的是.NET 可以自動(dòng)進(jìn)行回收的資源,主要是指托管堆上分配的內(nèi)存資源[1]。GC 類中包含了垃圾回收相關(guān)的方法,其中GC.KeepAlive 是其中一個(gè)較為特別的方法,它利用編譯器和運(yùn)行時(shí)的特性,阻止對象過早被回收。

        1 GC.KeepAlive 的使用場景

        示例1

        在類Value中,實(shí)現(xiàn)了IDisposable中的Dispose方法,在類OuterClass 中,析構(gòu)方法調(diào)用類成員i 的Dispose 方法來釋放資源。

        在Main 函數(shù)中,生成了一個(gè)Outerclass 的對象,變量名為outer,并將outer.i 作為參數(shù)傳遞給Do函數(shù)。outer.i 作為參數(shù)傳入之后,不存在對Outerclass 的對象的使用,因此垃圾回收器認(rèn)為該對象已經(jīng)無用,而outer.i 是有效的。從這時(shí)起到程序運(yùn)行結(jié)束的任何時(shí)刻,垃圾回收器都有可能執(zhí)行一次回收(回收Outerclass 的對象)。在垃圾回收器調(diào)用outer 的析構(gòu)方法后,outer.i 已經(jīng)執(zhí)行了Dispose 方法,從而Do 函數(shù)中對outer.i 的操作可能是無效的,造成程序出錯(cuò)(圖1)。

        圖1 不調(diào)用GC.KeepAlive 方法時(shí)程序的執(zhí)行流程

        若在Do(outer.i)后添加“GC.KeepAlive(outer)”,則Do 方法調(diào)用之后依然有對outer 的使用,保證了在調(diào)用Do 方法的時(shí)候,OuterClass 的對象不會(huì)被垃圾回收器回收(圖2)[2]。

        圖2 調(diào)用GC.KeepAlive 方法時(shí)程序的執(zhí)行流程

        2 實(shí)現(xiàn)原理

        Microsoft 對該方法的官方實(shí)現(xiàn)為:

        2.1 屬性(Attribute)的使用

        屬性(Attribute)是用于在運(yùn)行時(shí)傳遞程序中各種元素(類、結(jié)構(gòu)體、方法等)的行為信息的聲明性質(zhì)的標(biāo)簽,它添加元數(shù)據(jù),如編譯器指令和注釋、描述、方法、類等其他信息。

        .NET 提供了兩種類型的特性:預(yù)定義特性和自定義特性。MethodImplAttribute 和Reliability-Contract 都屬于預(yù)定義特性[3]。

        2.2 MethodImplAttribute 的使用

        MethodImplAttribute 屬性指定了一個(gè)方法是怎樣編譯和執(zhí)行的。

        ImplOptions.NoInlining 指定了該方法不應(yīng)該被內(nèi)聯(lián),由于GC.KeepAlive 并沒有對傳入的對象進(jìn)行任何操作(也不應(yīng)該進(jìn)行任何操作),假如將其內(nèi)聯(lián),將不能保證在調(diào)用該方法之前傳入的對象不被垃圾回收。

        ReliabilityContract 屬性與實(shí)現(xiàn)原理無關(guān),與安全性和可靠性有關(guān),因此不做解析。

        2.3 在調(diào)用GC.KeepAlive 之前對象不被回收的原因分析

        .NET 的垃圾回收器使用一種引用跟蹤算法。在垃圾回收時(shí),暫停所有線程,遍歷所有堆內(nèi)存中存在的對象,若引用類型變量引用了某個(gè)對象,該對象的同步索引字段將被置為1,否則為0。完成遍歷后,同步索引字段為0 的對象是可以被回收的(不一定會(huì)被回收)[4]。

        在示例1 中,outer.i 作為參數(shù)傳入后,假設(shè)垃圾回收器開始回收,將發(fā)現(xiàn)OuterClass 的對象的同步索引塊標(biāo)記為0,這意味著沒有變量繼續(xù)引用OuterClass 的對象,則其可以回收。

        若加上“GC.KeepAlive(outer)”,則outer.i 作為參數(shù)傳入后,假如垃圾回收器開始回收,發(fā)現(xiàn)在Main 函數(shù)中還有待調(diào)用的GC.KeepAlive 方法使用了OuterClass 的對象,因此在調(diào)用GC.KeepAlive 之前,同步索引塊都為1,即該對象都必須存在,不應(yīng)該被回收。假設(shè)將“GC.KeepAlive(outer)”替換成“var str=outer.ToString ()” 等語句(只要使用了OuterClass 的對象),和調(diào)用GC.KeepAlive 方法的作用是一樣的,只是該方法不產(chǎn)生任何副作用。

        3.NET 源碼中對該方法運(yùn)用的示例分析

        3.1 GC.GetGeneration 方法的實(shí)現(xiàn)

        示例2:

        .NET 的垃圾回收器查找未被引用的對象時(shí),使用可達(dá)性分析算法[5],WeakReference 引用變量不會(huì)存在于GCRoots 開始的引用鏈中。若在調(diào)用GetGenerationWR 方法之后不調(diào)用KeepAlive 方法,不能保證wo 所指向的對象一定是存在的,造成調(diào)用失敗。

        3.2 X509Utils.GetCertContext 方法的實(shí)現(xiàn)

        示例3:

        在將certificate.Handle 作為參數(shù)傳入CertDuplicateCertificateContext 方法后,若沒有GC.KeepAlive 方法,將導(dǎo)致certificate 隨時(shí)被垃圾回收,導(dǎo)致certificate.Handle 失效。

        3.3 RuntimeHelpers.PrepareMethod 方法的實(shí)現(xiàn)

        示例4:

        PrepareMethod 方法是對外部函數(shù)_PrepareMethod 的一層包裝,在CopyRuntimeTypeHandles 方法使用instantiation 作為參數(shù)后,instantiationHandles 的有效性依然依賴于instantiation,故在_PrepareMethod 函數(shù)后調(diào)用GC.KeepAlive 方法來保證instantiation 在PrepareMethod 函數(shù)返回前都是有效的。

        4 結(jié)語

        GC.KeepAlive 的實(shí)現(xiàn)并未調(diào)用.NET 中的內(nèi)部類和方法,也未調(diào)用Win32 的API,其實(shí)質(zhì)是運(yùn)用了編譯器和運(yùn)行時(shí)的特性,保證了對象不被過早回收,其實(shí)現(xiàn)十分簡潔。在實(shí)際運(yùn)用中準(zhǔn)確運(yùn)用此方法,提高了程序的安全性和穩(wěn)定性。

        猜你喜歡
        編譯器調(diào)用示例
        大還是小
        基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
        2019年高考上海卷作文示例
        核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
        常見單位符號(hào)大小寫混淆示例
        山東冶金(2019年5期)2019-11-16 09:09:22
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        “全等三角形”錯(cuò)解示例
        基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
        通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
        利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
        中国女人a毛片免费全部播放| 亚洲国产成人影院在线播放| 欧美最猛黑人xxxx黑人猛交| 久久人人爽天天玩人人妻精品| 亚洲电影中文字幕| 日本久久黄色高清视频| 精品亚洲一区二区三区四| 国产亚洲精品久久777777| 久久日本三级韩国三级| 久久精品国产亚洲vr| 精品久久久久88久久久| 亚洲国产日韩综一区二区在性色| 国产在线视频一区二区三| 中文字幕一二三四五六七区| 色综合av综合无码综合网站| 人人妻人人添人人爽日韩欧美| 午夜短无码| 在线高清亚洲精品二区| 人妻体内射精一区二区三区| 亚洲色欲色欲www在线观看| 奇米狠狠色| 91精品国产色综合久久不| 精品激情成人影院在线播放| 久久亚洲色www成人欧美| 亚洲三级香港三级久久| 亚洲国产成人va在线观看天堂| 国产a√无码专区亚洲av| 男男受被攻做哭娇喘声视频 | 久久久久亚洲女同一区二区| 一二区视频免费在线观看| 不卡日韩av在线播放| 日产学生妹在线观看| 欧美日韩另类视频| 国产精品人成在线765| 国产一区二区三免费视频| 欧美成人猛交69| 亚洲成a人片在线看| 玩弄丝袜美腿超短裙校花| 亚洲av成人无码久久精品老人| 亚洲日韩国产精品第一页一区| 日本一区二区不卡超清在线播放 |