999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

.NET Framework GC.Keep Alive方法的實現原理分析

2021-08-07 11:56:18楊存偉
鄂州大學學報 2021年4期
關鍵詞:資源方法

楊存偉

(西南大學 計算機科學與技術系,重慶 402460)

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

1 GC.KeepAlive 的使用場景

示例1

在類Value中,實現了IDisposable中的Dispose方法,在類OuterClass 中,析構方法調用類成員i 的Dispose 方法來釋放資源。

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

圖1 不調用GC.KeepAlive 方法時程序的執行流程

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

圖2 調用GC.KeepAlive 方法時程序的執行流程

2 實現原理

Microsoft 對該方法的官方實現為:

2.1 屬性(Attribute)的使用

屬性(Attribute)是用于在運行時傳遞程序中各種元素(類、結構體、方法等)的行為信息的聲明性質的標簽,它添加元數據,如編譯器指令和注釋、描述、方法、類等其他信息。

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

2.2 MethodImplAttribute 的使用

MethodImplAttribute 屬性指定了一個方法是怎樣編譯和執行的。

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

ReliabilityContract 屬性與實現原理無關,與安全性和可靠性有關,因此不做解析。

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

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

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

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

3.NET 源碼中對該方法運用的示例分析

3.1 GC.GetGeneration 方法的實現

示例2:

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

3.2 X509Utils.GetCertContext 方法的實現

示例3:

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

3.3 RuntimeHelpers.PrepareMethod 方法的實現

示例4:

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

4 結語

GC.KeepAlive 的實現并未調用.NET 中的內部類和方法,也未調用Win32 的API,其實質是運用了編譯器和運行時的特性,保證了對象不被過早回收,其實現十分簡潔。在實際運用中準確運用此方法,提高了程序的安全性和穩定性。

猜你喜歡
資源方法
讓有限的“資源”更有效
基礎教育資源展示
一樣的資源,不一樣的收獲
學習方法
資源回收
資源再生 歡迎訂閱
資源再生(2017年3期)2017-06-01 12:20:59
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 亚洲无码91视频| 国内丰满少妇猛烈精品播| 亚洲欧美日韩中文字幕一区二区三区| 97青青青国产在线播放| 丝袜美女被出水视频一区| 色综合天天综合中文网| 国产精品无码制服丝袜| 国产幂在线无码精品| 999精品色在线观看| 国产综合另类小说色区色噜噜| 毛片在线播放a| 国产精品成人一区二区不卡| 久久青草精品一区二区三区 | 亚洲不卡影院| 亚洲AV无码久久精品色欲| 国产无人区一区二区三区| 99999久久久久久亚洲| 中文字幕首页系列人妻| 免费人成在线观看视频色| 一级毛片在线播放免费观看| 国产噜噜噜视频在线观看| 久久综合AV免费观看| 色老头综合网| av在线无码浏览| 青青草原国产| 亚洲国产精品成人久久综合影院| 欧美亚洲日韩不卡在线在线观看| 人妻中文字幕无码久久一区| 国产精品偷伦视频免费观看国产| 亚洲av无码成人专区| 欧美.成人.综合在线| 亚洲成人一区二区三区| 欧美精品成人| 日韩欧美中文字幕在线韩免费| 午夜性刺激在线观看免费| 亚洲制服丝袜第一页| 免费看一级毛片波多结衣| 伊人久综合| 国产99在线| 午夜福利在线观看成人| 中国成人在线视频| 不卡网亚洲无码| 国产精品福利导航| 一级成人a毛片免费播放| 国产三区二区| 国产在线一区视频| 欧美一区二区自偷自拍视频| 国产美女无遮挡免费视频| 国产欧美精品午夜在线播放| 午夜视频日本| 欧美第一页在线| 国产精品一区二区无码免费看片| 波多野结衣无码视频在线观看| 亚洲AⅤ综合在线欧美一区| 国产精品视频系列专区| 久热99这里只有精品视频6| 韩日免费小视频| 无码aaa视频| 亚洲成a人片在线观看88| 久久国产拍爱| 91在线中文| 欧美一级在线| 91国语视频| 国产亚洲欧美另类一区二区| 色婷婷在线播放| 影音先锋丝袜制服| 亚洲人成色77777在线观看| 国产精品中文免费福利| 99精品视频播放| 日韩av无码精品专区| 国产日本欧美亚洲精品视| 亚洲欧洲天堂色AV| a网站在线观看| 国产第一色| 都市激情亚洲综合久久| 免费大黄网站在线观看| 视频国产精品丝袜第一页| 欧美午夜视频在线| 国产女人18水真多毛片18精品| 日本爱爱精品一区二区| 欧美成人午夜影院| 日韩在线成年视频人网站观看|