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

.NET垃圾收集關鍵方法解析

開發 后端
文章通過分析.NET垃圾收集中的重要方法,讓大家更加了解.Net GC的運行機制,相信大家通過本文,能夠很全面的了解.NET GC方面的知識。

之前51cto曾報道過關于.NET垃圾收集機制中的算法與代齡,說到.NET垃圾收集,就不得不提到其中的關鍵方法,其是實現.NET GC運行機制的前提。

1.Dispose()方法

Dispose可用于釋放所有資源,包括托管的和非托管的,需要自己實現。大多數的非托管資源都要求手動釋放,我們應當為釋放非托管資源公開一個方法,實現釋放非托管資源的方法有很多種,實現IDispose接口的Dispose方法是***的,這可以給使用你類庫的程序員以明確的說明,讓他們知道怎樣釋放你的資源;而且C#中用到的using語句快,也是在離開語句塊時自動調用Dispose方法。

這里需要注意的是,如果基類實現了IDispose接口,那么它的派生類也必須實現自己的IDispose,并在其Dispose方法中調用基類中Dispose方法。只有這樣的才能保證當你使用派生類實例后,釋放資源時,連同基類中的非托管資源一起釋放掉。

使用using與try+finally的區別

可以說二者沒有任何區別,因為using只是編輯器級的優化,它與try+finally有著相同的作用,以下是一段使用using的代碼,它在IL階段也是以try+finally呈現的,但是,using的優點是,在代碼離開using塊時,using會自動調用Idispose接口的Dispose()方法。

  1. public partial class _Default : System.Web.UI.Page  
  2. {      
  3. protected void Page_Load(object sender, EventArgs e)   
  4. {   
  5. using (DataSet ds = new DataSet())  
  6. {   
  7.  }  
  8. }  
  1. .method family hidebysig instance void  Page_Load(object sender,class [mscorlib]System.EventArgs e) cil managed  
  2. {  
  3.     // 代碼大小       29 (0x1d)  
  4.     .maxstack  2  
  5.     .locals init ([0] class [System.Data]System.Data.DataSet ds,  
  6.              [1] bool CS$4$0000)  
  7.     IL_0000:  nop  
  8.     IL_0001:  newobj     instance void [System.Data]System.Data.DataSet::.ctor()  
  9.     IL_0006:  stloc.0  
  10.     .try  
  11.     {  
  12.       IL_0007:  nop  
  13.       IL_0008:  nop  
  14.       IL_0009:  leave.s    IL_001b  
  15.     }  // end .try  
  16.     finally  
  17.     {  
  18.       IL_000b:  ldloc.0  
  19.       IL_000c:  ldnull  
  20.       IL_000d:  ceq  
  21.       IL_000f:  stloc.1  
  22.       IL_0010:  ldloc.1  
  23.       IL_0011:  brtrue.s   IL_001a  
  24.       IL_0013:  ldloc.0  
  25.       IL_0014:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()  
  26.       IL_0019:  nop  
  27.       IL_001a:  endfinally  
  28.     }  // end handler  
  29.     IL_001b:  nop  
  30.     IL_001c:  ret  
  31. } // end of method _Default::Page_Load 

2. GC.Collect()方法

如果我們在程序中顯式的調用了垃圾收集器的collect接口,那么垃圾收集器會立即運行,完成內存對象的標記、壓縮與清除工作,使用GC.Collect(i)還可以指定回收的代,然而aicken并不贊成各位同學顯式調用它:

(1)GC.Collect()做的并不只是回收內存,就像***節中介紹的,在回收了內存之后,GC會重新整理內存,修正對象指針,讓空閑內存連續,供CLR順序分配內存,提高新建對象的效率。內存壓縮整理工作非常耗用計算資源。

(2)很少有人會關心到GC除了在內存吃緊以及資源空閑時運行,還會在什么時候運行。 其實GC的運行時機,還要受到一個叫做“策略引擎”的部件控制,它會觀察GC的收集頻率、效率等等。它會根據GC回收效果,調整GC運行的頻率:即當某次GC回收效果頗豐時,它便會增加GC運行的頻率,反之亦然。

所以如果剛剛發生了一次自然的收集,垃圾對象就會非常之少,而此時程序又顯式的進行了收集調用,那么自然, GC雖然小有收獲,但是策略引擎就會認為:這很不值得,才收集了這么點垃圾,也許該減少GC的次數。這樣一來,垃圾收集器努力保持的自然節奏就被打亂了,同時,對象類型的創建效率與頻率,也會被“策略引擎”捕捉到,從而改變代的數量與容量。

所以,額外的調用GC,代價高昂,甚至會降低效率。顯示的調用GC.Collect(),實質是在用“時間換空間”,而通常在程序設計中,我們推薦的設計原則是“空間換時間”,比如使用各種各樣的緩存,也有例外,如果你掌握了整個應用程序的情況,明確的知道何時會產生大量垃圾,也是可以顯示調用該方法的。綜上,盡量不要顯示調用GC.Collect(),因為服務器的CPU比內存要貴的多! #p#

3. 析構函數(Finalize())

我們知道,GC只負責釋放托管資源,非托管資源GC是無法釋放的。類似文件操作、數據庫連接等都會產用非托管資源。Finalize方法是用于釋放非托管資源的,等同于C#中是析構函數,C#編譯器在編譯構造函數時,會隱式的將析構函數編譯為Finalize()對應的代碼,并確定在finally塊中執行了base.Finalize()。析構函數中只能釋放非托管資源,而不要在任何托管資源進行析構,原因如下:

(1)你無法預測析構函數的運行時機,它不是按順序執行的。當析構函數被執行的時候,也許你進行操作的托管資源已經被釋放了。

(2)包含Finalize()的對象,需要GC的兩次處理才能刪除。

(3)CLR會在單獨的線程上執行所有對象的Finalize()方法,無疑,如果頻繁的Finalize(),會降低系統的性能。

下面我們來重點說說第(2)點,為何包含Finalize()的對象,需要兩次GC才能被清除。首先要了解與Finalize相關的兩個隊列:終止隊列(Finalization Queue)與可達隊列(Freachable Queue),這兩個隊列存儲了一組指向對象的指針,當程序中在托管堆上分配空間時(new),如果該類含有析構函數,GC將在Finalization Queue中添加一個指向該對象的指針。

在GC***運行時,會在已經被確認為垃圾的對象中遍歷,如果某個垃圾對象的指針被Finalization Queue包含,GC將這個對象從垃圾中分離出來,將它的指針儲存到Freachable Queue中,并在Finalization Queue刪除這個對象的指針記錄,這時該對象就不是垃圾了——這個過程被稱為是對象的復生(Resurrection)。當Freachable Queue一旦被添加了指針之后,它就會去執行對象的Finalize()方法,清除對象占用的資源。

當GC再次運行時,便會再次發現這個含有Finalize()方法的垃圾對象,但此時它在Finalization Queue中已經沒有記錄了(GC***運行時刪掉了它的Finalization Queue記錄),那么這個對象就會被回收了,至此,通過GC兩次運行,終于回收了帶有析構函數的對象。復活實例:

  1. private void Form1_Load(object sender, EventArgs e)   
  2. {  
  3. Resource re = new Resource();     
  4. re = null;GC.Collect();  
  5. GC.WaitForPendingFinalizers();  
  6. //***GC.Collect()沒起作用哦。   
  7. label1.Text = re.num.ToString();  
  8. }    
  9. public class Resource  
  10. {  
  11. public int num;  
  12. ~Resource()  
  13. {  
  14.  
  15. }  
  16. }  

看了上面的代碼,大家應該了解什么是復活了吧!那么為什么要復生呢?因為***GC時,這個對象的Finalize()方法還沒有被執行,如果不經過復生就被GC掉,那么就連它的Finalize()一起回收了,Finalize()就無法運行了,所以必須先復生,以執行它的Finalize(),然后再回收。

還有兩個方法ReRegisterForFinalize和SuppressFinalize需要講一講,ReRegisterForFinalize是將指向對象的指針重新添加到Finalization Queue中(即召喚系統執行Finalize()方法),SuppressFinalize是將對象的指針從Finalization Queue中移除(即拒絕系統執行Finalize()方法)。

SuppressFinalize用于那些即有析構函數來釋放資源,又實現了Dispose()方法釋放資源的情況下:將GC.SuppressFinalize(this)添加至Dispose()方法中,以確保程序員調用Dispose()后,GC就不必再次收集了,即實現Idisposable中的Dispose()方法,又使用析構函數,一個雙保險,大家不要迷惑,其實在釋放非托管資源時,使用一個即可,推薦使用前者。代碼如下:

  1. public class Resource : Idisposable  
  2. {  
  3.   private bool isDispose = false;  
  4.   //實現Dispose(),后面還有析構函數,以防程序員忘記調用Dispose()方法  
  5.     public void Dispose()   
  6.       {  
  7.        Dispose(true);  
  8.     GC.SuppressFinalize(this);  
  9.       }  
  10.    protected virtual void Dispose(bool disposing)  
  11.    {  
  12.     if (!isDispose)  
  13.     {  
  14.      if (disposing)  
  15.      {  
  16.       //清理托管資源  
  17.      }  
  18.      //清理非管資源  
  19.     }  
  20.     isDispose = true;  
  21.    }  
  22.       Resource ()  
  23.    {  
  24.     Dispose(false);  
  25.    }  
  26.  } 

4.弱引用(WeakReference)

***一個話題:弱引用。在編程中,對于那些大對象建議使用這種引用方式,這種引用不影響GC回收:我們用過了某個對象,然后將其至null,這樣GC就可以快速回收它了,但是沒過多久我們又需要這個對象了,沒辦法,只好重新創建實例,這樣就浪費了創建實例所需的計算資源;而如果不至null,就會浪費內存資源。對于這種情況,我們可以創建一個這個大對象的弱引用,這樣在內存不夠時GC可以快速回收,而在沒有被GC回收前我們還可以再次利用該對象。

  1. public class SomeObject   
  2. {  
  3.  
  4. }  
  5. public static void Main()   
  6. {  
  7.  SomeObject so = new SomeObject();  
  8.  WeakReference WRso = new WeakReference(so);  
  9.  so = null;  
  10.  Console.WriteLine(WRso.IsAlive); // True  
  11.  // 調用GC 手動回收。  
  12.  GC.Collect();  
  13.  Console.WriteLine(WRso.IsAlive); // False  

看到沒,在so = null;后,它的弱引用依然是可用的。所以對于大對象的使用,aicken建議使用此種方式。另外,弱引用有長短之分:長弱引用在對象終結后,依然追蹤對象;短弱引用則反之,aicken不建議人為干預GC的工作成果,所以推薦使用短弱引用,即上面代碼中的方式。

文章原標題:.NET Discovery系列之三--深入理解.NET垃圾收集機制(下)

原文鏈接:http://www.cnblogs.com/isline/archive/2009/03/04/1402713.html

【編輯推薦】

  1. .NET垃圾收集機制 了解算法與代齡
  2. 淺析提高.NET垃圾回收性能的幾種方法
  3. 觀點:微軟.NET各子技術領域的應用前景
  4. .NET Framework 4.0功能特點詳細講解
  5. 深入.NET Framework 4.0 關于Lazy的點滴
責任編輯:王曉東 來源: CSDN博客
相關推薦

2010-01-06 16:33:50

.Net Framew

2010-02-22 08:58:35

JVM內存模型垃圾收集

2009-10-30 10:47:48

VB.NET垃圾收集器

2010-03-04 10:08:54

.Net垃圾收集

2009-06-15 16:14:40

Java垃圾收集算法GC

2024-03-27 10:27:35

延遲垃圾收集器

2024-01-15 11:12:28

Go內存開發

2024-07-15 08:00:00

2009-09-18 09:16:06

.NET垃圾回收

2021-09-07 11:23:09

智能垃圾箱物聯網IOT

2010-01-21 16:37:56

VB.NET變量聲明

2011-05-10 16:04:45

Java垃圾收集器

2011-08-17 15:37:23

Objective-C垃圾收集

2010-01-21 17:48:25

VB.NET Sing

2010-01-18 18:06:07

VB.NET多線程

2025-04-22 08:16:37

refC#參數

2024-05-28 00:00:03

Java垃圾收集機制

2023-02-26 11:50:04

Hbase程序Oracle

2017-05-09 15:34:54

方案垃圾收集信息化

2011-07-21 14:54:26

java垃圾收集器
點贊
收藏

51CTO技術棧公眾號

亚洲xxxx3d动漫| 日韩无套无码精品| 免费观看成年人视频| 亚洲精品免费观看| 亚洲性夜色噜噜噜7777| 亚洲一级片av| 日本不卡免费高清视频在线| 欧美高清在线精品一区| 99国产超薄肉色丝袜交足的后果| 国产69精品久久久久久久久久| 第一会所亚洲原创| 亚洲国产精久久久久久久| www.xxx亚洲| 岛国毛片av在线| 国产偷国产偷精品高清尤物| 亚洲va欧美va在线观看| 天堂а√在线中文在线新版| 欧美不卡在线| 这里只有精品视频| 日本免费福利视频| 秋霞午夜一区二区三区视频| 在线观看欧美精品| 久久视频这里有精品| 麻豆视频在线观看免费| 久久一区二区三区四区| 91九色露脸| 一级片一区二区三区| 久久国产高清| 97色伦亚洲国产| 男女做暖暖视频| 日韩av有码| 亚洲欧美日韩精品久久亚洲区 | 在线成人视屏 | 高潮毛片又色又爽免费 | 日本福利一区| 精品乱人伦小说| 伊人免费视频二| 亚洲免费一区| 欧美日韩一卡二卡| 久久综合伊人77777麻豆最新章节| 僵尸再翻生在线观看免费国语| 有码一区二区三区| 三年中国中文在线观看免费播放| p色视频免费在线观看| 国产网红主播福利一区二区| 欧美12av| 青青草免费在线| 久久久噜噜噜久久人人看 | 高h调教冰块play男男双性文| 精品一区二区综合| 国产欧美久久久久久| 国产精品xxxxxx| 日日噜噜夜夜狠狠视频欧美人 | 日韩a级黄色片| 在线看福利影| 亚洲一区二区三区四区不卡| 丁香婷婷综合激情| 超碰成人av| 欧美日韩国产在线看| 日本十八禁视频无遮挡| 国产传媒在线观看| 色哟哟日韩精品| 日本三区在线观看| 国产原创一区| 欧美高清你懂得| 亚洲热在线视频| 国产精品毛片久久久| 免费成人在线网站| 久久久久这里只有精品| 老女人性淫交视频| 伊人天天综合| 欧洲成人免费aa| 中文字幕激情视频| 国产伦精品一区二区三区免费迷 | 亚洲图片欧美日韩| 日韩电影在线一区二区| 国产精品一区二区久久精品| 国产喷水吹潮视频www| 国产成人在线免费| 久久资源亚洲| 992tv免费直播在线观看| 亚洲欧美综合色| 精品少妇人欧美激情在线观看| 超碰激情在线| 欧美日韩一区三区四区| 色婷婷狠狠18禁久久| 日本中文字幕在线一区| 在线播放日韩av| 国产97免费视频| 亚洲精品社区| 国产精品入口福利| 粉嫩小泬无遮挡久久久久久| 国产午夜精品理论片a级大结局 | 91精品久久久久久久久久久久| 日韩成人a**站| 久久久中文字幕| 午夜精品一区二| 国产精品中文字幕日韩精品| 久久免费99精品久久久久久| 久草中文在线观看| 欧美日韩激情美女| 欧美成人手机在线视频| 久久大胆人体视频| 色av中文字幕一区| 天天综合天天干| 国产精品自拍在线| 日本一区视频在线| 久草在线资源站资源站| 欧美亚洲综合色| 无码人妻一区二区三区在线| 久久福利影院| 欧美主播福利视频| www香蕉视频| 亚洲国产成人私人影院tom| 国产av熟女一区二区三区| 97欧美成人| 精品小视频在线| 麻豆视频在线观看| 久久se这里有精品| 欧美日韩一区在线视频| 日本一本在线免费福利| 69堂精品视频| 在线看片中文字幕| 美女久久一区| 国内视频一区二区| 羞羞的视频在线观看| 欧美午夜片在线看| 在线观看日韩精品视频| 一区二区视频欧美| 亚洲一区二区中文| 91在线看黄| 欧洲一区二区三区免费视频| av网站有哪些| 亚洲经典三级| 国产一区二区视频在线免费观看| 成人免费网址| 91精品国产综合久久福利软件| 成熟人妻av无码专区| 免费亚洲视频| 久久亚洲高清| 亚洲插插视频| 国产丝袜精品视频| 日韩欧美三级视频| 91在线视频观看| 国产精品国产亚洲精品看不卡| 欧州一区二区三区| 欧美男插女视频| 性欧美8khd高清极品| 亚洲免费观看视频| 1314成人网| 欧美精品大片| 国产精品久久久久久久久久久久午夜片| www.欧美日本韩国| 日韩视频一区二区在线观看| 免费无码毛片一区二区app| 国产精品123区| 黄色a级片免费看| 国产精品毛片视频| 7777kkkk成人观看| 黄上黄在线观看| 91国产成人在线| 91无套直看片红桃在线观看| 九色综合狠狠综合久久| 久久久成人精品一区二区三区| 国产激情综合| 久久久亚洲国产天美传媒修理工| 人妻少妇一区二区三区| 欧美视频在线视频| 亚洲黄色免费视频| 精品午夜久久福利影院| 青青草视频国产| 任我爽精品视频在线播放| 国产成人免费av| 国产在线更新| 日韩av在线导航| 国模私拍一区二区| 亚洲人成伊人成综合网小说| 中文字幕在线国产| 葵司免费一区二区三区四区五区| 一本色道久久99精品综合| 欧美成人一级| 欧美性受xxxx白人性爽| 91精品专区| 亚洲成年网站在线观看| 欧美人一级淫片a免费播放| 中文字幕一区二区三区不卡在线| 欧美日韩一区二区区| 翔田千里一区二区| 一区二区三区四区国产| 国产精品对白久久久久粗| 国产成人亚洲综合91| 国产精品久久久久久福利| 精品91自产拍在线观看一区| 日本一本在线观看| 亚洲线精品一区二区三区 | 国产剧情一区| 亚洲曰本av电影| 九九热线视频只有这里最精品| 久久精品亚洲一区| 精品无人乱码| 日韩精品一区二区三区中文精品| 精品久久久久久久久久久久久久久久| 中文字幕日韩欧美一区二区三区| 欧美在线一级片| 国产在线精品不卡| 蜜臀av午夜一区二区三区| 中文一区一区三区免费在线观看| 欧美久久久久久| 亚洲一区二区电影| 国产精品久久久久久婷婷天堂| 大香伊人中文字幕精品| 久久亚洲精品小早川怜子66| 九色视频在线观看免费播放| 欧美精品一区二区三区久久久| 性色av一区二区三区四区| 婷婷六月综合网| 国产探花在线免费观看| 国产日韩欧美精品电影三级在线| 国产大学生视频| 国产麻豆日韩欧美久久| 成人性生生活性生交12| 国产模特精品视频久久久久| 成年女人18级毛片毛片免费 | 久久国产精品视频在线观看| 小处雏高清一区二区三区| 久久精品美女| 国产精品115| www.成人av.com| 狂野欧美xxxx韩国少妇| 国产噜噜噜噜噜久久久久久久久 | 久草中文在线| 丝袜美腿亚洲一区二区| 超碰国产在线| 国产午夜精品全部视频播放 | 欧美日本三级| 成人a在线观看| 国产黄色精品| 国产精品亚洲欧美导航| 日韩毛片在线| 国产精品久久久久久久久久免费 | 国产盗摄在线观看| 中文字幕精品网| 二区三区在线| 中文字幕久热精品视频在线| 粉嫩一区二区三区国产精品| 在线观看成人黄色| yjizz视频网站在线播放| 中文字幕av一区二区| av在线三区| 久久好看免费视频| 午夜免费福利在线观看| 最近2019中文字幕在线高清| 天堂中文а√在线| 久久精品欧美视频| 中文字幕在线观看播放| 久久999免费视频| 黄页网站大全在线免费观看| 国内精品久久久久久| 国产福利电影在线播放| 午夜精品视频在线| 色是在线视频| 国产精品高潮呻吟久久av无限| 99久久er| 91青草视频久久| 亚洲国产欧美在线观看| 国产女主播一区二区| 亚洲素人在线| 手机成人在线| 一本一道久久a久久精品蜜桃| 无码人妻精品一区二区三区99v| 在线看片不卡| 欧美日韩激情视频在线观看| 丝袜诱惑亚洲看片| 亚洲最大天堂网| 粉嫩av一区二区三区在线播放| av黄色一级片| 中文字幕中文乱码欧美一区二区| 成年人av电影| 岛国av午夜精品| 伊人成人在线观看| 精品剧情v国产在线观看在线| 神马久久精品| 久久精品国产亚洲精品| а_天堂中文在线| 国产精品久久久久久久久久东京| 免费一区二区三区在线视频| 蜜桃成人在线| 亚洲国产日韩欧美在线| 免费观看日韩毛片| 黑人巨大精品欧美一区| 国模私拍在线观看| 中文字幕视频一区| 91视频免费网址| 91精品欧美综合在线观看最新| 五月天婷婷在线观看| 俺去亚洲欧洲欧美日韩| 在线天堂新版最新版在线8| 成人a免费视频| 国产精品最新| 日韩日韩日韩日韩日韩| 免费成人你懂的| 污片免费在线观看| 亚洲女女做受ⅹxx高潮| 中文字幕日韩免费| 亚洲大胆人体在线| 免费黄色网址在线观看| 欧美在线免费观看| theporn国产在线精品| 亚洲ai欧洲av| 亚洲综合不卡| 中文在线字幕观看| 中文字幕一区二区三区精华液| 五月天婷婷久久| 精品三级在线看| 免费黄色在线观看| 国产精品久久77777| 美女一区2区| 2022中文字幕| 国产在线视频一区二区三区| 国产人妻大战黑人20p| 精品久久久久久亚洲精品| 国产激情视频在线播放| 中文字幕日韩综合av| 欧美日韩美女| 久久国产精品精品国产色婷婷| 一区二区三区毛片免费| 国产成年人视频网站| 国产女同性恋一区二区| 丰满少妇xoxoxo视频| 亚洲国产精品推荐| eeuss鲁一区二区三区| 91影院未满十八岁禁止入内| 先锋资源久久| 亚洲一区二区福利视频| 国产免费观看久久| 日韩熟女一区二区| 亚洲欧美色图片| 亚洲一区资源| 欧美一区二区三区四区夜夜大片 | 天天操天天爱天天干| 欧美黑人一级爽快片淫片高清| 99久久久国产| 国产卡一卡二在线| 国产在线精品不卡| 亚洲综合视频网站| 日韩视频永久免费| 国产色婷婷在线| 国产欧美日韩一区二区三区| 国内揄拍国内精品久久| caopor在线| 午夜精品福利在线| 午夜在线视频免费| 欧亚精品中文字幕| 欧美日韩一二三四| 亚洲人视频在线| 亚洲精品中文在线观看| 亚洲第一成人av| 97视频人免费观看| 中日韩免视频上线全都免费| 国产性生交xxxxx免费| 中文字幕精品在线不卡| 一本色道久久综合亚洲| 久久五月天综合| 国产精品对白久久久久粗| 午夜肉伦伦影院| 日本一区二区三区久久久久久久久不 | 欧美极品jizzhd欧美仙踪林| 精品国产91久久久| 国产在线黄色| 成人福利免费观看| 在线观看一区| 亚洲一区二区自偷自拍| 这里是久久伊人| 咪咪网在线视频| 亚洲资源视频| 成人网页在线观看| 国产精品久久久久久人| 精品国产美女在线| 秋霞影院一区二区三区| 国产高潮免费视频| 一区2区3区在线看| 国产一二三区在线视频| 91亚洲永久免费精品| 亚洲综合不卡| 加勒比婷婷色综合久久| 亚洲剧情一区二区| 日日狠狠久久| 欧洲黄色一级视频| 日韩一区日韩二区| 亚洲人在线观看视频| 成人黄在线观看| 免费视频一区| 久久久无码一区二区三区| 伊人久久久久久久久久久| 成人福利一区| 第一区免费在线观看| 精品日韩中文字幕| 91网址在线观看| 日韩欧美三级一区二区| 不卡的av电影在线观看|