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

.NET對象清理:垃圾回收和資源清理

原創
開發 后端
在 .NET 中垃圾回收和資源清理是重中之重的內容,也是所有程序都必須用到的機制,但是有很大一部分開發人員并不知道垃圾回收和資源清理的原理。那么,我將通過這篇文章向各位讀者詳細講解一下垃圾回收和資源清理。

[[318251]]

【51CTO.com原創稿件】在 .NET 中垃圾回收和資源清理是重中之重的內容,也是所有程序都必須用到的機制,但是有很大一部分開發人員并不知道垃圾回收和資源清理的原理。那么,我將通過這篇文章向各位讀者詳細講解一下垃圾回收和資源清理。

一、垃圾回收

.NET中垃圾回收是運行時的核心功能,它的作用是回收不再被引用的對象所占用的內存。這里我們要注意垃圾回收器只回收內存資源而不處理其他資源。此外垃圾回收器是根據是否存在任何引用來決定要清理那些東西,也就是說垃圾回收器處理的是不被引用的引用對象,并且只能回收堆上的內存。

  1. 簡述 在 .NET 中垃圾回收的很多細節都和 CLI 有關,我們常用的 Microsoft.NET 框架中實現垃圾回收的算法是 mark-and-compact 算法 。當每次一次垃圾回收周期開始時,它會查找對象的所有根引用(一般來說根引用來自靜態變量、CPU寄存器和局部變量或參數實例的任何引用)。基于查找到的所有根引用,垃圾回收器就可以遍歷每個根引用標識的樹形結構,并遞歸確定每個根引用指向的對象,進而識別出所有可達對象。

    當執行垃圾回收時,垃圾回收器會將所有可達對象一個挨一個的放在一起,這樣就可以覆蓋不可達對象所占用的內存。為了定位和移動可達對象,進程中所有托管線程都會在垃圾回收期間暫停運行,這樣就可以保證垃圾回收器在運行期間維持狀態一致性。雖然這么做會造成應用程序短暫停止工作,但是一般來說只要垃圾回收周期不是特別長,這個短暫的停止工作是很難發覺的。在我們開發時有時可能不希望在運行一些代碼段時執行垃圾回收,這時我們可以在代碼段之前使用 System.GC 對象所包含的 Collect 方法來讓垃圾回收暫時跳過這些代碼。當然這么做是不會阻止垃圾回收運行的,只是減少了這部分代碼可能被回收的概率,但是這里有一個前提條件:代碼段執行期間不會發生內存被大量消耗使用的情況。在 .NET 中垃圾回收有一個特別的地方,就是并非所有的垃圾都會在一個垃圾回收周期內被回收。這是為什么呢?因為在 .NET 垃圾回收器中有一個名字叫 generation 的概念,翻譯成中文就是 。它會清理那些生存時間較短的對象,那些在一次垃圾回收周期中存活下來的對象會降低清理頻率。也就是說當一個對象在一次垃圾回收周期中存活下來,那么它將會被移動到下一代中,如果它又在一次垃圾回收周期中存活下來,那么它將被移動到最后一代,也就是第二代(為什么是第二代呢?因為 .NET 垃圾回收機制中代是從 0 開始的),第零代清理速度最快,第二代清理速度最慢。
  2. 弱引用 弱引用這個名詞很少有開發人員聽過,所謂的弱引用是為創建起來開銷很高并且維護成本也很大的對象而設計的。它不阻止垃圾回收器對對象的回收,但會維持一個引用,進而可以在被垃圾回收器回收之前可以重用。例如我們從數據庫中查詢一個龐大的數據列表向用戶展示,如果沒有使用弱引用當用戶關閉了這個列表,那么垃圾回收器就有很大可能將它回收,那么當用戶再次查看這個列表時,程序又需要從數據庫查詢并加載出來,這種操作成本是很高昂的。如果使用了如引用,每次請求列表時代碼首先檢查列表是否被清除,如果沒有被清除就直接將列表展示給用戶,如果被清除了就從數據庫查詢并展示給用戶,這就相當于對象在內存中進行了緩存。如果開發人員認為對象應該進行弱引用,那么就可以把這個對象賦值給 System.WeakReference 。下面我們來看一個弱認證的簡單例子:

    1. WeakReference Data; 
    2. public FileStream Date() 
    3.    FileStream fs= (FileStream)Data.Target; 
    4.    if(data!=null
    5.   { 
    6.        return data; 
    7.   } 
    8.    // more code 
    9.    Data.Target=data; 
    10.    return data; 

    上面的代碼是一個標準的創建弱引用的代碼,我們可以看到在代碼中對變量 data 進行了 null 判斷,我們可以通過這個判斷來檢查垃圾回收器是否將其回收。這里還有一個關鍵代碼 FileStream fs= (FileStream)Data.Target; 這里將弱引用賦值給了強引用,這樣可以避免在檢查 null 后和訪問數據前,發生垃圾回收器回收弱引用。

二、資源清理

在前面一小節開頭我們說過垃圾回收之回收內存中的對象,那么如果我們需要回收其他資源呢,例如數據庫連接、句柄、外部設備。這時我們就需要用到資源清理。

終結器 終結器是一個允許開發人員通過代碼來清理類資源的東西。終結器最大的特征是它不能在代碼中顯式調用,只有垃圾回收器負責對對象的實例調用終結器,因此開發人員無法在編譯時確定終結器在何時執行,只能夠確定終結器時對象中最后一次被調用的地方。 終結器的定義也很簡單,只需要在類名之前加一個 ~ 符號即可。 

  1. class Demo 
  2.    public Demo(string name
  3.   { 
  4.        //more code 
  5.   } 
  6.     
  7.    ~Demo() 
  8.   { 
  9.        Close(); 
  10.   } 
  11.    public void Close() 
  12.   { 
  13.        //more code 
  14.   } 
  15.    //more code 

上述代碼我們就定義了一個簡單的終結器,我們定義終結器的時候需要注意以下四點:

因為終結器是在自己的線程中執行的,因此如果終結器中存在一個未處理的異常就會很難診斷發現,因為造成異常的情況并不清晰透明。所以我們必須避免在終結器中引發異常。 

  • 終結器是不允許傳遞任何參數的,也不能重載它;
  • 因為它是被垃圾回收器所調用,因此給終結器加上訪問修飾符是毫無意義的;
  • 如果父類中存在終結器,那么將會作為子類終結器的一部分被自動調用;
  • 終結器必須顯示的釋放資源。
  1. using 雖然終結器可以幫助我們在忘記顯式調用必要清理代碼的時候執行清理,但是因為終結器的運行存在不確定性,因此我們只能將它作為備用機制。正常情況下我們可以使用 using C# 中的 IDisposable 接口的 Dispose 方法為我們提供了實現細節。我們先來看一段代碼。

    1. class Demo 
    2.    MyFileStream fs =new myFileStram(); 
    3.    //more code 
    4.    fs.Dispose(); 
    5.    //more code 
    6. class MyFileStream:IDisposable 
    7.    public MyFileStream(string path) 
    8.   { 
    9.        //more code 
    10.   } 
    11.    //more code 
    12.    ~MyFileStream 
    13.   { 
    14.        Dispose(false); 
    15.   } 
    16.    public void Close() 
    17.   { 
    18.        Dispose(); 
    19.   } 
    20.    public void Dispose() 
    21.   { 
    22.        Dispose(true); 
    23.        System.GC.SuppressFinalize(); 
    24.   } 
    25.    public void Dispose(bool para) 
    26.   { 
    27.        // more code 
    28.   } 

    上述代碼中我們顯式調用了 MyFileStream 類的 Dispose 方法。 Dispose 方法主要用來清理已經用過的資源,但是這里存在一個問題,當我們調用 Dispose 方法時有可能會發生異常,這時我們就無法正確調用 Dispose 方法了,為了避免這個問題我們需要加入 try..finally 塊。但是我們無法保證開發人員每次都會寫 try...finally ,這時我們可以使用 C# 提供的 using 語句,我們將上面的調用代碼修改一下:

    1. class Demo 
    2.    using(MyFileStream fs =new myFileStram()) 
    3.   { 
    4.        //more code 
    5.   } 

    這段代碼最終生成的 CIL 代碼和使用 try...finally 塊生成的代碼完全一樣。

  2. 垃圾回收、終結和 IDisposable 在上一小節的代碼中我們看到在 Dispose 方法中我們調用了 System.GC.SuppressFinalize(); ,它的作用是從終結隊列中移除 MyFileStream 實例。因為所有清理都在Dispose 方法中完成了,而不是等著終結器執行。如果不調用 System.GC.SuppressFinalize() 方法實例將會一直在終結隊列中,只有當終結方法被調用之后才能在垃圾回收器中被回收,那么這就造成了托管資源垃圾回收處理時間的延遲。 Dispose 方法中調用了 Dispose(bool para) 方法,在這個方法里我們可以清理資源并阻止終結器。其次,我們定義了 Close 方法來調用 Dispose(bool para) 方法,這樣終結器就可以調用 Dispose(bool para) 方法來關閉釋放資源。針對前一小結的代碼需要有如下幾點注意:

    在某些特殊情況下垃圾回收的對象有可能會被無意中重新引用一個待終結的對象。這樣,被重新引用的對象就不再是不可訪問的,所以不能當作垃圾被回收掉。假如對象的終結方法已經運行,那么除非顯式標記為要進行終結,否則終結方法不一定會再次運行。

  • 只針對開銷大,成本高的對象實現終結器;
  • 如果類存在終結器那么就必須實現 IDisposable ;
  • 不要在終結器中拋出異常;
  • 在 Dispose 方法中必須調用 System.GC.SuppressFinalize ;
  • 保證 Dispose 可以被重用;
  • 保證 Dispose 方法的簡單性;
  • 不能在終結器中調用未被終結的其他對象;
  • 如果父類存在終結器,再重寫時必須調用父類終結器;
  • 調用 Dispose 方法之后,將對象設為不可用。

三、小結

這篇文章詳細講解了垃圾回收和資源清理相關的知識,對于部分開發人員來說這部分知識可能晦澀難懂,但是只要在實際項目中上手使用,我相信就可以很快的掌握和理解。

作者介紹:

朱鋼,筆名喵叔,國內某技術博客認證專家,.NET高級開發工程師,7年一線開發經驗,參與過電子政務系統和AI客服系統的開發,以及互聯網招聘網站的架構設計,目前就職于一家初創公司,從事企業級安全監控系統的開發。

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:龐桂玉 來源: 51CTO
相關推薦

2012-12-18 13:57:42

.NetC#

2013-08-19 17:25:18

.Net托管

2009-06-15 16:14:40

Java垃圾收集算法GC

2009-02-18 20:35:13

Windows系統垃圾

2022-01-20 10:34:49

JVM垃圾回收算法

2021-09-05 23:50:56

手機內存技術

2021-10-25 22:40:27

Windows 10Windows微軟

2024-07-25 11:22:23

2022-03-21 11:33:11

JVM垃圾回收器垃圾回收算法

2021-11-05 15:23:20

JVM回收算法

2021-12-26 18:23:10

Kubernetes集群命令

2009-08-26 08:52:13

Windows 7垃圾清理

2012-05-02 16:09:13

系統垃圾

2009-08-21 19:10:53

Windows 7系統垃圾清理

2021-12-08 23:19:11

手機蘋果內存

2022-10-08 18:25:22

Python內存管理GC

2018-04-08 16:49:47

App Store應用程序蘋果

2011-08-29 16:07:35

Ubuntu

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2021-01-04 10:08:07

垃圾回收Java虛擬機
點贊
收藏

51CTO技術棧公眾號

怡红院成人在线| 亚洲免费一级片| 久久国产电影| 日韩视频中午一区| 欧美久久久久久久久久久久久久| www.xxx国产| 久久国产主播| 欧美片一区二区三区| 素人fc2av清纯18岁| 亚洲老司机网| 欧美日韩国产精品一区| 久久久一二三四| 青青草在线播放| 久久精品国产秦先生| 性欧美在线看片a免费观看| 美女久久久久久久久久| 视频亚洲一区二区| 欧美三电影在线| 国内少妇毛片视频| 毛片av在线| 久久精品一区二区| www国产亚洲精品| 亚洲图片在线播放| 免费视频久久| 欧美激情综合色| 四虎地址8848| 精品成人影院| 亚洲精品国产拍免费91在线| 污污视频在线免费| 国产原创一区| 欧美性开放视频| 免费人成自慰网站| 国产精品刘玥久久一区| 国产日韩欧美在线一区| 久久国产日韩欧美| 亚洲欧美激情国产综合久久久| 久久国产精品第一页| 日本中文字幕成人| www.国产成人| 日韩亚洲精品在线| 午夜精品理论片| 国产精品第二十页| 欧美午夜视频| 欧美精品一二区| 538精品在线视频| 国产精品久久占久久| 在线观看不卡av| 久久日免费视频| 日韩精品久久久久久久电影99爱| 国产亚洲精品成人av久久ww| 精品无码人妻一区| 妖精视频一区二区三区| 亚洲欧美一区二区三区情侣bbw| 日本人添下边视频免费| 国内露脸中年夫妇交换精品| 欧美精品一区二区三| 中文字幕免费高清视频| 韩国精品福利一区二区三区 | 午夜精品久久久久久久白皮肤 | 91黄色免费看| 亚洲黄色a v| 福利一区在线| 欧美男男青年gay1069videost| 久久99爱视频| 亚洲精品成a人ⅴ香蕉片| 欧美日本国产一区| 天堂中文av在线| 国产成人免费视频网站视频社区| 欧美一区二区视频在线观看2020| 91视频免费入口| 91夜夜蜜桃臀一区二区三区| 亚洲国产欧美日韩精品| aa片在线观看视频在线播放| 国产一区二区区别| 菠萝蜜影院一区二区免费| 精品人妻伦九区久久aaa片| 综合激情一区| 7777免费精品视频| 国产99久久久久久免费看| 老司机免费视频一区二区| 69堂成人精品视频免费| 天天色综合久久| 国产欧美一区二区三区鸳鸯浴| 日本特级黄色大片| 波多野结衣在线高清| 欧美三级xxx| 国产视频1区2区3区| 国产一区精品二区| 精品一区二区三区三区| chinese全程对白| 91久久中文| 国产精品一区二区久久久久| 精品欧美在线观看| 久久久久久久电影| 日本天堂免费a| 国产精品高清乱码在线观看 | 99日在线视频| 精品三级av在线导航| 国产午夜精品一区二区三区| 成年人午夜剧场| 久久成人国产| 97超碰人人模人人爽人人看| 三级理论午夜在线观看| 亚洲天堂免费在线观看视频| 中文字幕无码精品亚洲资源网久久| 午夜无码国产理论在线| 欧美丝袜第三区| 欧美 变态 另类 人妖| 艳女tv在线观看国产一区| 全球成人中文在线| 亚洲av综合色区无码一二三区| 国产亚洲欧美日韩在线一区| 美脚丝袜脚交一区二区| 色8久久久久| 亚洲欧洲美洲在线综合| 国产亚洲欧美精品久久久www| 人人精品人人爱| 亚洲影院污污.| 搞黄视频在线观看| 黑人巨大精品欧美一区二区| 欧美色图校园春色| 色135综合网| 日韩av免费在线播放| 全国男人的天堂网| 亚洲欧美日韩久久| 天天综合网日韩| 亚洲人成精品久久久| 国模吧一区二区| www天堂在线| 亚洲欧美偷拍另类a∨色屁股| 人妻无码视频一区二区三区| 日本欧美三级| 91禁外国网站| 污污的视频网站在线观看| 亚洲精品福利视频网站| 午夜视频在线观| 国产二区精品| 成人免费午夜电影| 免费看美女视频在线网站| 欧美色电影在线| 黄色片在线观看免费| 久久久久国产精品一区二区| 农村寡妇一区二区三区| 三级在线观看视频| 日韩成人久久久| 国产精品久久久久久99| 波多野洁衣一区| 免费不卡av在线| 美女视频亚洲色图| 91精品国产99| 日本在线视频1区| 色天使久久综合网天天| 成人午夜剧场视频网站| 肉色丝袜一区二区| 三区精品视频| 日韩免费大片| 欧美成人手机在线| www.av日韩| 午夜av电影一区| 中文字幕人妻一区二区| 天堂在线亚洲视频| 亚洲国产欧美日韩| 秋霞一区二区| 国自在线精品视频| 日本人妖在线| 欧美在线一二三| 波兰性xxxxx极品hd| 国产一区二区在线观看视频| 97久久国产亚洲精品超碰热| 日本午夜精品久久久| 国产精品欧美日韩一区二区| 欧美激情免费| 精品国偷自产国产一区| 天天干天天干天天| 国产精品麻豆视频| 免费欧美一级片| 国产一区成人| 先锋影音欧美| 视频二区欧美| 国产成人高潮免费观看精品| 欧美精品日韩少妇| 亚洲а∨天堂久久精品喷水| 国产99免费视频| 亚洲欧美二区三区| 香港三级日本三级| 免费看黄色91| av网站大全免费| 欧美日韩久久精品| 粉嫩高清一区二区三区精品视频 | 国产51人人成人人人人爽色哟哟| 欧美一区二区在线观看| 精品欧美一区二区三区免费观看| 欧美激情一区在线| 丰满少妇xbxb毛片日本| 日韩精品欧美成人高清一区二区| 中文字幕一区二区三区四区五区人| 成人自拍在线| 国产欧美精品在线| 激情黄产视频在线免费观看| 日韩视频免费观看| 毛片免费在线| 日韩精品中午字幕| 亚洲男人天堂网址| 亚洲va欧美va国产va天堂影院| 少妇精品无码一区二区免费视频| 成人av在线电影| 国产日韩欧美久久| 国产精品美女| 久久久久久久香蕉| 波多野结衣在线观看一区二区三区 | 青青国产精品| 57pao国产成人免费| av免费在线网站| 伊人久久五月天| 天天操天天干天天爽| 日韩欧美中文字幕精品| 中文字幕人妻一区二区在线视频 | 欧美三级一级片| 国产综合欧美| www国产无套内射com| 99久久婷婷国产综合精品电影√| 久久青青草原一区二区| 视频精品二区| 91嫩草免费看| 欧美9999| 亚洲一区二区三区乱码aⅴ蜜桃女| 丝袜美腿一区| 日本精品中文字幕| 日韩深夜视频| 国产91精品不卡视频| 菠萝蜜视频在线观看www入口| 美女福利精品视频| 免费黄色网页在线观看| 最近中文字幕2019免费| 国产三级视频在线| 亚洲欧美日韩天堂| 色丁香婷婷综合久久| 精品国产免费一区二区三区四区| www黄色在线观看| 精品久久久久久久久久久久久久久久久| 一本色道久久综合亚洲| 欧美日韩视频在线第一区| 亚洲精品久久久久久久蜜桃| 日本道精品一区二区三区| 在线观看 亚洲| 91福利小视频| 中日韩av在线| 欧美日韩国产bt| 国产精品毛片一区视频播| 欧美人与z0zoxxxx视频| 国产又粗又猛又爽又黄视频| 欧美精品vⅰdeose4hd| 国产精品热久久| 欧美一区二区精品| 精品美女www爽爽爽视频| 欧美mv日韩mv国产| 午夜视频福利在线观看| 亚洲天堂免费在线| 91caoporn在线| 另类色图亚洲色图| 欧美videos另类精品| 国模极品一区二区三区| 都市激情亚洲综合| 国产精品嫩草影院久久久| 91麻豆精品一二三区在线| 999精品视频一区二区三区| 豆花视频一区二区| 欧美日韩国产一二| 99久久激情| 国产一区二区三区乱码| 免费视频一区二区三区在线观看| 老司机午夜av| 国产精品中文字幕日韩精品 | 一区二区三区国产免费| 精品一区二区三区在线播放视频 | 大香伊人久久精品一区二区 | 国产精品国产一区| 国产精品videossex国产高清| 夜久久久久久| 日本黄大片一区二区三区| 国产成人av在线影院| 丰满少妇一区二区| 日韩美女久久久| 黄色片视频网站| 欧美调教femdomvk| 亚洲av无码乱码国产麻豆| 精品无人区乱码1区2区3区在线| av国产在线观看| 久久久久久噜噜噜久久久精品| 韩日成人影院| 91久久国产综合久久蜜月精品| 欧美一级色片| 国产三级中文字幕| 国产欧美一区二区三区国产幕精品| www.日本一区| 成人激情av网| 登山的目的在线| 欧美日韩亚洲精品一区二区三区| 国产精品国产三级国产aⅴ| 亚洲风情亚aⅴ在线发布| 日本综合在线| 日韩av片电影专区| 亚洲一区二区电影| 一区二区三区国| 美女91精品| 亚洲av无码一区东京热久久| 中文久久乱码一区二区| 亚洲黄色一区二区| 91精品午夜视频| 国产剧情在线观看| 97视频在线观看播放| 美女精品视频在线| 亚洲精品日韩在线观看| 亚洲一区免费| 少妇精品无码一区二区| 中文字幕日本不卡| 波多野结衣日韩| 日韩av在线资源| 日本高清成人vr专区| 国产欧洲精品视频| 欧美日韩精品一区二区视频| 69堂免费视频| av高清不卡在线| 亚洲国产成人精品综合99| 欧美日本一区二区在线观看| 欧美女v视频| 国产999精品久久久影片官网| 国产无遮挡裸体免费久久| 精品无码av无码免费专区| 国模无码大尺度一区二区三区| 超碰97av在线| 在线亚洲一区二区| 久久精品蜜桃| 国产成人综合精品| 国产99久久精品一区二区300| av日韩一区二区三区| 成人黄色一级视频| 日本三级午夜理伦三级三| 亚洲国产成人一区| 91破解版在线观看| 国产视频精品网| 在线亚洲国产精品网站| 黄色国产在线观看| 欧美视频在线观看免费网址| 性感美女一级片| 国内精久久久久久久久久人| 操欧美女人视频| 欧美久久久久久久久久久久久| av亚洲精华国产精华精| 中文字幕在线观看视频网站| 日韩经典中文字幕在线观看| 韩国美女久久| 亚洲精品乱码久久久久久蜜桃91 | 日本中文字幕在线看| 国产美女精品免费电影| 91麻豆精品国产91久久久平台| 亚洲免费av一区| 一区二区在线观看视频| 亚洲精品久久久久久动漫器材一区 | 国产中文一区二区三区| 日本黄色片免费观看| 日韩视频一区在线观看| cao在线视频| 欧美中日韩免费视频| 美女尤物国产一区| 极品盗摄国产盗摄合集| 亚洲国产精品国自产拍av秋霞| 中文字幕成在线观看| 四虎永久国产精品| 国产一区高清在线| 国产成人精品a视频一区| 国产亚洲精品久久| 麻豆精品国产| 国产最新免费视频| 中文字幕中文字幕一区二区| 精品国产99久久久久久宅男i| 2019中文字幕免费视频| 日韩精品久久| 国产性生活毛片| 欧美性xxxxxx少妇| 亚洲丝袜精品| 欧美自拍资源在线| 国产精品影音先锋| 久久久久久久久久久久久av| 日韩在线视频网站| 久久婷婷国产| 伊人色在线观看| 天天综合网天天综合色| 日本高清中文字幕在线| 国产一区二区黄色| 久久国产精品色| 成年人免费高清视频| xxxxxxxxx欧美| 亚洲高清极品| 特黄特黄一级片| 日本精品一区二区三区高清| 日韩av毛片| 亚洲图色在线| 久久无码av三级| 亚洲av无码国产精品永久一区|