精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产一区二区精品福利地址| 美女黄视频在线观看| 欧美一区二区| 日韩视频免费观看高清完整版| 久草视频这里只有精品| 亚洲三区在线播放| 日本在线不卡一区| 欧美成人精品h版在线观看| 成人啪啪18免费游戏链接| 无码小电影在线观看网站免费| 久久久噜噜噜久噜久久综合| 成人欧美一区二区三区黑人| 自拍偷拍欧美亚洲| 第四色成人网| 精品国产一二三| 黄色在线视频网| 毛片网站在线看| 国产精品午夜在线| 国产一区二区精品免费| 亚洲专区在线播放| 国产欧美日韩亚洲一区二区三区| 在线视频日本亚洲性| av天堂一区二区| 六九午夜精品视频| 欧美午夜精品久久久久久久| 裸体裸乳免费看| 久久av少妇| 成人小视频免费在线观看| 国产日韩一区在线| 欧美性猛交xxxx乱大交hd| 亚洲一本视频| 一区二区三区日韩在线| 欧美一区二区免费在线观看| 国产亚洲高清一区| 欧美日韩中文字幕一区| 国产 福利 在线| 大香伊人中文字幕精品| 亚洲欧美日韩国产成人精品影院 | 中文字幕精品视频在线观看| 亚洲欧美综合国产精品一区| 久久精品国产亚洲精品| 老头老太做爰xxx视频| 日韩av不卡一区| 精品少妇一区二区三区在线视频 | 国产91露脸合集magnet| 国产成人中文字幕| 麻豆亚洲av熟女国产一区二 | 成人一级黄色片| 成人免费在线视频网站| 中国女人真人一级毛片| 午夜在线一区二区| 亚州精品天堂中文字幕| 国产在线免费视频| 亚洲国产一区二区精品专区| 久久99久国产精品黄毛片入口 | 亚洲一区二区三区免费视频| 国产大尺度在线观看| 伊人免费在线| 国产精品欧美一区喷水| 日韩精彩视频| 久久久pmvav| 久久欧美中文字幕| 欧美精品亚洲精品| 麻豆导航在线观看| 久久久亚洲高清| 免费成人av网站| 欧美日韩国产综合视频| 久久免费午夜影院| 日韩精品久久一区二区三区| 国产免费a∨片在线观看不卡| 久久久精品黄色| 日韩高清av| 日韩免费啪啪| 亚洲人成亚洲人成在线观看图片| 四虎4hu永久免费入口| 中文av资源在线| 亚洲高清在线视频| 红桃av在线播放| 欧美国产日韩电影| 制服丝袜激情欧洲亚洲| 99热这里只有精品2| 国产精品白丝av嫩草影院| 亚洲国产精品999| 免费观看av网站| 日本久久黄色| 久久91亚洲精品中文字幕| 日本成人看片网址| 一起草最新网址| 911亚洲精品| 日韩国产精品亚洲а∨天堂免| brazzers精品成人一区| 99久久精品国产亚洲精品 | 这里只有精品电影| 亚洲少妇一区二区三区| 嫩草一区二区三区| 久久精品国产清自在天天线| 久热这里只有精品在线| 久久午夜精品一区二区| 国产日韩欧美中文| 手机看片1024国产| 国产精品视频九色porn| 日韩a级在线观看| 99热播精品免费| 日韩欧美高清dvd碟片| 亚洲av无码成人精品国产| 欧美日韩精品一区二区视频| 久久综合伊人77777| 九九免费精品视频| 日韩成人精品在线| 成人精品一二区| 国产精品一区在线看| 一区二区三区中文字幕在线观看| 国产免费黄色av| 国产一区一区| 亚洲免费小视频| 激情视频在线播放| 日本怡春院一区二区| 成人免费在线看片| 男人和女人做事情在线视频网站免费观看| 亚洲成人免费电影| 两性午夜免费视频| 美女写真理伦片在线看| 国产一区二区三区亚洲综合| 欧美日韩黄色一区二区| 岛国精品资源网站| 888久久久| 国产精品毛片a∨一区二区三区|国| www.色呦呦| 自拍偷在线精品自拍偷无码专区| 日韩少妇内射免费播放18禁裸乳| 日韩成人在线看| www.亚洲天堂| 伊人久久成人网| 久久精品亚洲乱码伦伦中文| 97超碰人人澡| 91欧美极品| 久久99热这里只有精品国产| 国产精品天天操| 国产精品免费av| 国产三级日本三级在线播放| 婷婷五月色综合香五月| 欧美极品少妇全裸体| a在线观看免费| 综合在线观看色| 中文字幕亚洲欧洲| 日韩大片在线播放| 国产精品国产福利国产秒拍| 黄色影院在线播放| 日韩欧美主播在线| 九色porny自拍视频| 性一交一乱一区二区洋洋av| 精品无人乱码一区二区三区的优势 | 中文av在线全新| 精品国产欧美一区二区| 侵犯稚嫩小箩莉h文系列小说| 精品一区二区三区视频在线观看 | 精品福利电影| 国产成人免费观看| 波多野结衣在线观看| 欧美精品一区二区久久婷婷| 日韩精品成人在线| 99精品一区二区三区| 播放灌醉水嫩大学生国内精品| 久久久久97| 97avcom| 黄色视屏网站在线免费观看| 欧美在线free| 91视频综合网| 成人在线综合网站| 波多野结衣家庭教师在线播放| 亚洲人成网www| 国产精品男人的天堂| 韩国av网站在线| 日韩欧美一区在线| 97免费在线观看视频| 久久婷婷综合激情| 伊人成人222| 影音先锋在线一区| 日韩精品资源| 9999在线精品视频| 久久久久久成人精品| 欧美另类自拍| 欧美男女性生活在线直播观看| 性欧美疯狂猛交69hd| 成人做爰69片免费看网站| 男人天堂网视频| 91偷拍一区二区三区精品| 91在线中文字幕| 欧产日产国产精品视频| 色一区av在线| 欧美综合视频在线| 欧美亚洲国产一区在线观看网站 | 欧美mv日韩| 国产精品免费一区二区| 最新日韩三级| 欧美成人免费一级人片100| 男同在线观看| 日韩欧美亚洲另类制服综合在线| 日本在线视频中文字幕| 欧美国产精品专区| 在线精品视频播放| 精品在线播放免费| 日韩精品视频久久| 亚洲精品888| 欧美一区视久久| 成人在线视频你懂的| 国产女人精品视频| 久久久男人天堂| 久久人人爽人人爽爽久久| 香港一级纯黄大片| 日韩一区二区电影| 国产成人av免费| 午夜国产精品一区| 亚洲国产成人精品综合99| 久久精品人人爽人人爽| 国产精品无码自拍| 免费人成精品欧美精品| www黄色日本| 伊人情人综合网| 涩涩涩999| 竹菊久久久久久久| 国严精品久久久久久亚洲影视| 成人免费91| 国产欧美日韩最新| 天堂久久午夜av| 欧美中文在线免费| 国产高清中文字幕在线| 久久99视频精品| 黄色网在线播放| 这里只有精品在线播放| 欧洲亚洲在线| 亚洲精品成人久久电影| 狠狠躁日日躁夜夜躁av| 欧美一个色资源| 91亚洲国产成人久久精品麻豆| 91久久香蕉国产日韩欧美9色| 亚洲第一精品在线观看| 午夜精品久久久久久不卡8050| 男女羞羞免费视频| 亚洲乱码国产乱码精品精98午夜| 国产精品麻豆免费版现看视频| 日本一区二区久久| 熟女少妇内射日韩亚洲| 久久在线免费观看| 欧美做受喷浆在线观看| 91蜜桃免费观看视频| 无码人妻精品一区二区三区温州| 不卡电影免费在线播放一区| 成人做爰69片免费| 成人av一区二区三区| 日韩av无码一区二区三区不卡| 丰满少妇久久久久久久| 日本泡妞xxxx免费视频软件| 国产成人亚洲综合a∨婷婷| 久草福利在线观看| 成人免费不卡视频| 在线观看国产免费视频| 久久尤物电影视频在线观看| 蜜桃无码一区二区三区| 国产精品久久毛片| 国产天堂av在线| 亚洲一区二区中文在线| 国产精品7777| 一本久久a久久免费精品不卡| 国产乱码77777777| 亚洲国产精品91| 亚洲毛片在线观看.| 视频一区二区在线播放| 亚洲摸下面视频| 成人高清免费观看mv| xxx一区二区| 污视频网站在线免费| 欧美国产亚洲视频| 亚洲欧美电影| 国产日韩视频在线观看| 日本在线成人| 精品久久久久久亚洲| 女厕嘘嘘一区二区在线播放| 亚洲欧美国产一区二区| 亚洲天堂免费| 大陆av在线播放| 日韩高清电影一区| 午夜一级免费视频| www.欧美日韩| 天美传媒免费在线观看| 亚洲一区二区三区四区五区黄| 日韩人妻精品中文字幕| 777xxx欧美| 天堂在线中文网| 日韩一区二区欧美| 色老头在线一区二区三区| 成人久久久久久久| 日韩一级电影| 国产又粗又大又爽的视频| 国产精品美女久久久| 国产aⅴ爽av久久久久| av日韩在线网站| 91ts人妖另类精品系列| 婷婷亚洲久悠悠色悠在线播放| 中文区中文字幕免费看| 精品成人一区二区三区| 免费国产在线观看| 欧美华人在线视频| 老司机精品视频网| 久久99精品国产一区二区三区| 欧美激情欧美| 青青在线视频免费| 成人黄色大片在线观看| 成人信息集中地| 日韩欧美国产激情| 亚洲精品久久久久久无码色欲四季| 亚洲天堂免费在线| 爱情岛论坛亚洲品质自拍视频网站| 国产剧情久久久久久| 国产探花在线播放| 国产精品久久久久三级| 国产一区二区99| 精品免费国产二区三区| 天天影视久久综合| 2020国产精品视频| 6080成人| 中文字幕一区二区三区精彩视频| 久久精品动漫| 中文字幕 亚洲一区| 亚洲最大色网站| 国产欧美一区二区三区视频在线观看| 亚洲精品综合久久中文字幕| 黄网站在线观| 成人三级在线| 综合视频在线| 亚洲在线观看网站| 国产精品麻豆网站| 日本丰满少妇做爰爽爽| 精品夜色国产国偷在线| 成入视频在线观看| 国产精品加勒比| 国产精品www.| 激情av中文字幕| 一区二区三区欧美久久| 国产99999| 久热精品视频在线免费观看| 婷婷久久免费视频| 一区二区三区三区在线| 老司机午夜精品| 亚洲 欧美 国产 另类| 欧美撒尿777hd撒尿| av在线天堂播放| 国产欧美精品在线播放| 99久久99热这里只有精品| 一级做a免费视频| 中文字幕第15页| 91精品国产综合久久久久久漫画 | 久久久久久久综合日本| 免费的毛片视频| 亚洲日本欧美日韩高观看| 不卡一二三区| 亚洲国产欧洲综合997久久 | 中文在线字幕观看| 亚洲综合在线第一页| 欧美天堂在线视频| 992tv在线成人免费观看| 最近国产精品视频| 日韩手机在线观看视频| 国产精品久久久久久亚洲伦| 一级做a爱片久久毛片| 精品中文字幕在线| 国产成人在线中文字幕| 伊人成色综合网| 欧美激情一区在线| 国产精品爽爽久久| 久久免费视频在线观看| 女人丝袜激情亚洲| 不用播放器的免费av| 夜夜精品视频一区二区 | 亚洲图片欧洲图片av| 欧洲精品久久久久毛片完整版| 精品一区二区成人免费视频| 成人永久aaa| 国产精品第六页| 欧美大胆a视频| 欧美男gay| 香蕉视频色在线观看| 舔着乳尖日韩一区| www.亚洲资源| 国产v亚洲v天堂无码| 日韩在线一区二区三区| 亚洲 欧美 变态 另类 综合| 欧美精品一区二区蜜臀亚洲| 91另类视频| 2018国产在线| 国产精品毛片无遮挡高清| 性一交一乱一精一晶| 日本老师69xxx| 亚洲精品成人影院| theav精尽人亡av| 91精品国产色综合久久| www.精品| 国产片侵犯亲女视频播放| 中文字幕精品一区| 黄色一级大片在线免费看国产一 |