亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

編寫高質量代碼改善C#程序的157個建議——建議52:及時釋放資源

2019-11-14 14:05:43
字體:
來源:轉載
供稿:網友

建議52:及時釋放資源

垃圾回收機制自動為我們隱式地回收了資源(垃圾回收器會自動調用終結器),那我們為什么要主動釋放資源呢?

PRivate void buttonOpen_Click(object sender,EventArgs e){   FileStream fileStream = new FileStream(@"c:/test.txt",FileMode.Open);           }private void buttonGC_Click(object sender,EventArgs e){   System.GC.Collect();   }

這是一個WinForm窗體程序的例子,在這個示例中,單擊一個按鈕負責打開一個文件,單擊另一個按鈕負責回收說有“代”(代的概念會在下文詳細指出)的垃圾。如果連續兩次單擊打開文件的按鈕,系統就會報錯:

IOException:文件“c:/test.txt”正由另外一進程使用,因此該進程無法訪問此文件。

如果先單擊打開文件的按鈕,繼而再單擊清理按鈕,則運行正常。

 

現在來分析:在打開文件的方法中,方法執行完畢后,由于局部變量fileStream在程序中已經沒有任何地方引用了,所以它會在下一次垃圾回收時被運行時標記為垃圾。那么,什么時候會進行下一次垃圾回收呢,后者說垃圾回收器什么時候才開始真正進行回收工作呢?微軟官方的解釋是,當滿足以下條件之一時將發生垃圾回收:

  • 系統具有低的物理內存。
  • 由托管堆上已分配的對象使用的內存超出了可接受的閾值。 這意味著可接受的內存使用的閾值已超過托管堆。 隨著進程的運行,此閾值會不斷地進行調整。
  • 調用 GC.Collect 方法。 幾乎在所有情況下,您都不必調用此方法,因為垃圾回收器會持續運行。 此方法主要用于特殊情況和測試。

 

不及時釋放資源是對系統的一種極大的浪費,這種浪費還會干擾程序的正常運行(如在本實例中,由于它始終占著文件資源,導致我們不能再次使用這個文件資源了)。

若果類型本身繼承了IDisposable接口,垃圾回收機制雖然會自動幫我們釋放資源,但是這個過程卻延長了,因為它不是在一次回收中完成所有的清理工作。本例中因為fileStream繼承了IDisposable接口,故第一次進行垃圾回收時,垃圾回收器會調用fileStream的終結器,然后等待下一次的垃圾回收,這時fileStream對象才有可能被真正的回收掉。

我們來改進這個程序:

private void buttonOpen_Click(object sender,EventArgs e){    FileStream fileStream = new FileStream(@"c:/test.txt",FileMode.Open);         fileStream.Dispose();      }

但是如果第一行代碼出現異常,就永遠執行不了filsStream.Dispose()了。再次改進:

private void buttonOpen_Click(object sender,EventArgs e){    try    {           FileStream fileStream = new FileStream(@"c:/test.txt",FileMode.Open);         }    finally    {        fileStream.Dispose();          }}

使用語法糖“using"關鍵字進一步簡化:

private void buttonOpen_Click(object sender,EventArgs e){    using(FileStream fileStream = new FileStream(@"c:/test.txt",FileMode.Open))    {        }}

 

 

關于“代數”:一共分為3代:第0代、第1代、第2代。

  • 第 0 代:這是最年輕的代,其中包含短生存期對象。 短生存期對象的一個示例是臨時變量。 垃圾回收最常發生在此代中。新分配的對象構成新一代的對象并且為隱式的第 0 代回收,除非它們是大對象,在這種情況下,它們將進入第 2 代回收中的大對象堆。大多數對象通過第 0 代中的垃圾回收進行回收,不會保留到下一代。
  • 第 1 代:這一代包含短生存期對象并用作短生存期對象和長生存期對象之間的緩沖區。
  • 第 2 代:這一代包含長生存期對象。 長生存期對象的一個示例是服務器應用程序中的一個包含在進程期間處于活動狀態的靜態數據的對象。

當條件得到滿足時,垃圾回收將在特定代上發生。 回收某個代意味著回收此代中的對象及其所有更年輕的代。 第 2 代垃圾回收也稱為完整垃圾回收,因為它回收所有代上的所有對象(即,托管堆中的所有對象)。

幸存和提升

垃圾回收中未回收的對象也稱為幸存者,并會被提升到下一代。 在第 0 代垃圾回收中幸存的對象將被提升到第 1 代;在第 1 代垃圾回收中幸存的對象將被提升到第 2 代;而在第 2 代垃圾回收中幸存的對象將仍為第 2 代。

當垃圾回收器檢測到某個代中的幸存率很高時,它會增加該代的分配閾值,因此下一次回收將會獲取一個非常大的回收內存。 CLR 會在以下兩個優先級別之前進行平衡:不允許應用程序的工作集獲取太大內存以及不允許垃圾回收花費太多時間。

暫時代和暫時段

因為第 0 代和第 1 代中的對象的生存期較短,因此,這些代被稱為暫時代。

暫時代必須在稱為暫時段的內存段中進行分配。 垃圾回收器獲取的每個新段將成為新的暫時段,并包含在第 0 代垃圾回收中幸存的對象。 舊的暫時段將成為新的第 2 代段。

 

更多內容可參考MSDN:垃圾回收的基礎

 

 

轉自:《編寫高質量代碼改善C#程序的157個建議》陸敏技


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91手机视频在线观看| www.欧美三级电影.com| 国产精品入口福利| 亚洲电影中文字幕| 亚洲美女av网站| 91夜夜未满十八勿入爽爽影院| 亚洲精品www久久久久久广东| 国产视频在线一区二区| 啪一啪鲁一鲁2019在线视频| 欧美—级a级欧美特级ar全黄| 亚洲美女黄色片| 国产精品久久久久久久久免费看| 日韩精品免费视频| 91色视频在线导航| 国产美女久久精品香蕉69| 欧美中在线观看| 久久精品国产清自在天天线| 亚洲va久久久噜噜噜| 国产精品一区二区三区成人| 成人福利网站在线观看11| 中文字幕日韩精品有码视频| 欧美大片欧美激情性色a∨久久| 亚洲人午夜精品| 亚洲精品91美女久久久久久久| 亚洲国产精品yw在线观看| 欧美做爰性生交视频| 日韩精品久久久久| 国产精品稀缺呦系列在线| 欧美视频在线观看免费| 国产精品久久久av久久久| 亚洲欧洲一区二区三区在线观看| 日韩av在线影视| 欧美日韩一区二区在线| 欧美日本中文字幕| 亚洲午夜久久久久久久| 91av国产在线| 欧美疯狂xxxx大交乱88av| 国产97在线|日韩| 亚洲欧美激情视频| 成人网在线观看| 国产成人亚洲综合青青| 97视频免费看| 久久精品国产一区二区三区| 日韩欧美精品中文字幕| 曰本色欧美视频在线| 97色在线播放视频| 国产亚洲精品久久久| 欧美猛少妇色xxxxx| 国产精品91在线| 日韩av网站导航| 日韩有码在线观看| 国产精品视频久久久| 欧美日韩亚洲系列| 久久成人国产精品| 亚洲高清福利视频| 中文日韩在线观看| 精品无人区太爽高潮在线播放| 色综合久久88色综合天天看泰| 精品一区二区三区电影| 久久久之久亚州精品露出| 国产视频精品va久久久久久| 欧美中文字幕第一页| 精品亚洲aⅴ在线观看| 人人做人人澡人人爽欧美| 97**国产露脸精品国产| 日本久久久久久久久久久| 日韩在线免费高清视频| 精品福利在线视频| 亚洲人线精品午夜| 欧亚精品在线观看| 欧美亚洲一级片| 国产精品成人一区| 欧美xxxx综合视频| 国产一区二区黑人欧美xxxx| 91中文字幕在线| 亚洲福利在线视频| 欧美午夜片在线免费观看| 中文字幕免费精品一区高清| 一区二区三区四区精品| 九九九久久国产免费| 91精品国产高清| 国产精自产拍久久久久久蜜| 日韩激情视频在线| 欧美大荫蒂xxx| 日韩av在线天堂网| 国产精自产拍久久久久久| 欧美另类高清videos| 久久精品国产亚洲精品| 亚洲精品久久久久中文字幕欢迎你| 国色天香2019中文字幕在线观看| 国产精品久久久久不卡| 亚洲欧美日韩一区二区三区在线| 亚洲欧美日韩一区二区三区在线| 精品无码久久久久久国产| 国产精品久久久久久亚洲调教| 2021久久精品国产99国产精品| 午夜精品久久久久久久久久久久久| 欧美激情一区二区三级高清视频| 91av视频在线免费观看| 69久久夜色精品国产69| 国产精品亚洲美女av网站| 国产精品激情av在线播放| 国产精品偷伦一区二区| 亚洲天堂网站在线观看视频| www.xxxx精品| 国产精品av免费在线观看| 91国产美女在线观看| 欧美孕妇与黑人孕交| 欧洲中文字幕国产精品| 色综合久综合久久综合久鬼88| 国产成人精品久久| 伊人成人开心激情综合网| 日韩一区二区av| 日本欧美一二三区| 欧美极品少妇全裸体| 久久久久久久久国产| 国产欧美日韩免费| 欧美成人精品在线播放| 精品中文字幕视频| 97视频在线观看成人| 日韩av色在线| 久久久久久久久久久久久久久久久久av| 精品亚洲国产视频| 在线观看久久av| 精品国产一区二区三区久久久| 日韩av中文字幕在线播放| 成人综合国产精品| 91精品综合久久久久久五月天| 北条麻妃一区二区在线观看| 538国产精品视频一区二区| 久久久999国产精品| 欧美丝袜一区二区三区| 亚洲精品在线看| 一区二区三区四区精品| 51ⅴ精品国产91久久久久久| 欧美日韩电影在线观看| 欧美成人sm免费视频| 亚洲精品一区中文字幕乱码| 久久91精品国产91久久久| 亚洲国产精品va在看黑人| 91精品国产91久久| 欧美伦理91i| 欧美性猛交xxxx免费看久久久| 国产成人精品免高潮费视频| 日韩在线视频线视频免费网站| 在线成人中文字幕| 国产激情综合五月久久| 97久久精品在线| 亚州av一区二区| 国产成人精品av在线| 亚洲精品美女久久久| 久久99精品久久久久久青青91| 久久视频精品在线| 成人性生交大片免费看小说| 亚洲精品动漫100p| 亚洲国产精彩中文乱码av在线播放| 久久久欧美精品| 国产精品你懂得| 26uuu另类亚洲欧美日本一| 国产精品9999| 欧美大胆在线视频| 亚洲精品成人av| 国产精品毛片a∨一区二区三区|国| 国产成人涩涩涩视频在线观看|