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

淺析Dotnet的垃圾回收

開發 前端
在早期C++的時候,內存分配和釋放都是由我們手動處理的,而在公共語言進行時CLR中,多了一個垃圾收集器GC,來充當自動內存管理器,完成同樣的工作。

[[384762]]

本文轉載自微信公眾號「老王Plus」,作者老王Plus。轉載本文請聯系老王Plus公眾號。

在說垃圾回收之前,先說說兩個概念:

  • 托管代碼,是由CLR管理的代碼
  • 非托管代碼,是由操作系統直接執行的代碼

在早期C++的時候,內存分配和釋放都是由我們手動處理的,而在公共語言進行時CLR中,多了一個垃圾收集器GC,來充當自動內存管理器,完成同樣的工作。從此,對于開發人員來說,我們可以不需要用顯式的代碼來執行內存管理。這樣做的好處是明顯的:大量相關內存的錯誤被消除了,比方沒有釋放對象導致的內存泄露,或試圖訪問已經釋放的對象的內存,等等。

為了防止不提供原網址的轉載,特在這里加上原文鏈接:https://abc.com

一、回收和管理托管資源

上面說了,垃圾回收GC在Dotnet中是一個自動的內存管理器,是一種機制,用來清理和回收堆內存中未引用的部分。

通常CLR會在這些情況下啟動垃圾回收:

  • 需要在堆上分配內存給一個新對象,但沒有足夠的空閑內存時;
  • 對象被強制Dispose時;
  • 托管堆上已分配對象的內存超過了閥值(這個閥值會動態調整);
  • 調用了GC.Collect方法

這些內容都是基礎,了解了非常好,面試時有話可說。不了解也沒關系,不會影響做一個好的程序出來。

下面的內容如果能記住,倒是對于程序開發很有幫助。

在Dotnet的垃圾回收機制中,回收器會自行優化并適用于多種方案。但是,我們仍然可以根據運行環境來設置垃圾回收的類型。

Dotnet的CLR提供了下面兩種類型的垃圾回收:

  • 工作站垃圾回收
  • 服務器垃圾回收

這兩種回收機制,有一定的區別。

工作站回收,主要是為客戶端應用設計的,也是程序默認的回收機制。垃圾回收的過程,跑在觸發垃圾回收的用戶線程上,并使用相同的優先級。這種方式,優點是不會被掛起或延遲,缺點是需要與其它線程競爭CPU時間。當運行環境中只有一個CPU時,系統會自動采用工作站方式,不管你設置成什么。

服務器回收,針對的是高吞吐的服務器應用,回收過程跑在專用的高優先級線程上,而且默認是多線程在跑,所以效率更高,缺點是占用的資源會更多,而且由于線程之間的干擾和上下文切換,會影響整體性能。

所以,選擇什么樣的回收機制,需要認真分析。通常普通應用,工作站回收就好。如果是服務器端的API服務,需要選擇服務器回收。而如果是在服務端需要啟動多個實例進行處理,比方對總線的數據保存,那還是工作站回收好。

設置垃圾回收方式,在開發時,可以在xxx.csproj文件中加入:

  1. <PropertyGroup>  
  2.   <ServerGarbageCollection>true</ServerGarbageCollection>  
  3. </PropertyGroup> 

其中,設置true就是服務器模式,設置false就是工作站模式,當然,去掉這一行,默認也是工作站模式。

對于生產環境中已經上線的應用,也可以修改回收模式。找到程序目錄中的xxx.runtimeconfig.json文件,在里面加入:

  1. "configProperties": { 
  2.   "System.GC.Server"true 

這兩個配置的關系是:如果開發時在.csproj中加入了ServerGarbageCollection,那在發布時會自動在.runtimeconfig.json中加入System.GC.Server。

二、回收和管理非托管資源

上面說到的回收機制,針對的是托管資源。

對于非托管資源,GC不會主動進行回收。回收非托管資源,只能手工編寫代碼并顯式的釋放。

通常來說,程序中用到的操作系統的資源文件、網絡或數據庫連接等,都屬于非托管資源,需要手工清理。

有兩種方法可以清理非托管理資源:

  • 使用終結器Finalize,并由GC回收
  • 手動處理Dispose

2.1 使用終結器Finalize

終結器Finalize是System.Object的一個虛方法,這個方法在GC回收對象的內存之前由垃圾回帳調用。我們可以重寫這個方法,來釋放非托管資源。

多說兩句:似乎MS對這個部分有些猶豫,所以這兒規則一直處在兩可之間。C#在析構函數的支持上并不嚴格。System.Object支持重寫Object.Finalize方法,但它創建的類卻不支持,重寫會報錯,而只能通過改寫析構函數來實現,并由編譯器將代碼包裝在try塊中的析構函數或重寫的Finalize中,并由finally調用Object.Finalize來實現。

使用終結器,缺點也是比較明顯的。GC檢測到一個對象需要回收時,會在一段不確定的時間之后調用終結器。這個不確定很討厭,我們很難預料什么時候對象被實際釋放。

Finalize雖然看著是手動清除非托管資源,其實還是由垃圾回收器去做的。它的最大作用是確保非托管資源一定被釋放。

2.2 手動處理Dispose

手動處理最重要的理由,是在需要的時候立即釋放,而不是讓垃圾回收器進行不確定延時后的釋放。

手動釋放,主要的工作是提供一個IDisposable.Dispose的實現,來實現非托管資源的確定性釋放。這樣,當需要釋放時,調用Dispose方法,就會立即釋放非托管資源。

手動處理實現起來很簡單。框架提供了一個接口System.IDisposable:

  1. public interface IDisposable   
  2. {   
  3.     void Dispose();   
  4. }   

他只包含一個方法Dispose。使用時,需要實現這個方法,在使用完成后及時釋放非托管資源。

同時,Dispose方法還提供了GC.SuppressFinalize方法,來告訴GC對象已經被手動處理,不再需要調用終結器。

  1. public void Dispose()   
  2. {   
  3.     GC.SuppressFinalize(this);   
  4. }  

這種方式下,對象的內存可以做到提前回收。

在某些情況下,可能無法調用IDisposable.Dispose方法來釋放非托管資源,但場景下又確實需要確定性地釋放,這時候可能通過重寫Object.Finalize來實現:

  1. public class MyClass     
  2. {     
  3.    ~MyClass()     
  4.    { 
  5.       //TODO: 釋放未托管的資源 
  6.    }     
  7. }     

有點奇怪,是不是?

其實,這就是上邊我說MS猶豫的地方。如果你直接重寫Object.Finalize,像下面這樣:

  1. public class MyClass     
  2. {     
  3.    protected override void Finalize()     
  4.    {     
  5.       //TODO: 釋放未托管的資源 
  6.    }     
  7. }   

編譯時會報錯Do not override object.Finalize. Instead, provide a destructor.,而他正確的寫法,就是析構函數。

上面說的內容,做成一個套路模板,就會是這樣的:

  1. public class MyClass : IDisposable 
  2.     private bool disposedValue; 
  3.  
  4.     protected virtual void Dispose(bool disposing) 
  5.     { 
  6.         if (!disposedValue) 
  7.         { 
  8.             if (disposing) 
  9.             { 
  10.                 // TODO: 釋放托管狀態(托管對象) 
  11.             } 
  12.  
  13.             // TODO: 釋放未托管的資源(未托管的對象)并替代終結器 
  14.             // TODO: 將大型字段設置為 null 
  15.             disposedValue = true
  16.         } 
  17.     } 
  18.  
  19.     ~MyClass() 
  20.     { 
  21.         Dispose(disposing: false); 
  22.     } 
  23.  
  24.     public void Dispose() 
  25.     { 
  26.         Dispose(disposing: true); 
  27.         GC.SuppressFinalize(this); 
  28.     } 

如果你看到了這兒,建議把上面這個套路模板存下來。這算是最完整的一個版本,網上能找到的,大多是簡化版。

其實,我們經常使用的很多類,都實現了IDisposable接口。比如說,凡是可以用using來進行調用類,就都實現了IDisposable接口。另外有一些類,把Dispose改成了一個別的名字,比方IO里的Close方法,就是一個Dispose。

另外,如果對象實現了IDisposable接口,而我們直接new了這個對象,那在使用結束后,我們就需要Dispose這個對象。因為既然設計者選擇了Dispose,那結束時調用Dispose就是正確的。

三、總結

最后做個簡單的總結。

垃圾回收模式選擇:應用程序可分配的資源少,或者能夠競爭到的資源少,就使用工作站模式,反之就使用服務器模式。

在回收處理上,托管資源就扔給GC自動處理,非托管資源需要手動處理:

其中:

Finalize是標記出非托管資源可被回收,然后由GC去執行回收工作 

Dispose是直接調用,并即時回收。

 

責任編輯:武曉燕 來源: 老王Plus
相關推薦

2009-06-23 14:15:00

Java垃圾回收

2009-09-18 09:16:06

.NET垃圾回收

2022-03-21 11:33:11

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

2022-01-20 10:34:49

JVM垃圾回收算法

2017-08-04 10:53:30

回收算法JVM垃圾回收器

2021-01-04 10:08:07

垃圾回收Java虛擬機

2020-07-09 08:26:42

Kubernetes容器開發

2021-11-05 15:23:20

JVM回收算法

2009-12-30 10:14:29

JVM垃圾回收

2009-07-06 17:34:22

Java垃圾回收

2022-06-22 09:54:45

JVM垃圾回收Java

2023-08-08 10:29:55

JVM優化垃圾回收

2010-12-13 11:14:04

Java垃圾回收算法

2023-12-19 21:52:51

Go垃圾回收開發

2009-06-25 17:48:24

Java垃圾回收

2011-07-04 16:48:56

JAVA垃圾回收機制GC

2017-06-12 17:38:32

Python垃圾回收引用

2009-12-25 16:15:31

JVM垃圾回收算法

2014-06-19 10:48:18

RubyPython

2017-03-03 09:26:48

PHP垃圾回收機制
點贊
收藏

51CTO技術棧公眾號

欧美女王vk| 老司机2019福利精品视频导航| 精品一区二区在线观看| 欧美巨乳美女视频| 一区二区三区免费在线观看视频| 欧洲精品一区二区三区| 成人免费在线视频| 国产亚洲精品自在久久| 亚洲午夜无码久久久久| 欧美日韩免费| 亚洲欧洲一区二区三区久久| 国产免费中文字幕| 国产精品蜜芽在线观看| 国产精品国产三级国产专播品爱网| 97伦理在线四区| 亚洲大片免费观看| 亚洲无线视频| 日韩在线精品一区| 超碰97人人干| 这里视频有精品| 日本韩国欧美一区二区三区| 久久www视频| 97视频在线观看网站| 成人午夜激情影院| 成人福利在线观看| 欧美超碰在线观看| 伊人成人在线| 久久国产精品久久久久久久久久 | 麻豆成人久久精品二区三区红 | 欧美尤物一区| 老熟妇高潮一区二区高清视频| 日本不卡视频一二三区| 欧美一区二区.| 欧美又粗又大又长| 小处雏高清一区二区三区| 亚洲三级免费看| 性久久久久久久久久久| 在线播放一区二区精品视频| 欧美精选午夜久久久乱码6080| 男人操女人免费| hd国产人妖ts另类视频| 亚洲免费色视频| 国产高潮呻吟久久久| 超碰国产在线| 亚洲国产精品传媒在线观看| 欧美日韩无遮挡| 头脑特工队2免费完整版在线观看| 国产不卡视频一区| 91精品国产99久久久久久红楼| 亚洲无码久久久久| 免费黄网站欧美| 国产精品久久久久久久久久久不卡| 国产污污视频在线观看 | 青青草精品视频在线观看| 亚洲欧美韩国| 色婷婷综合激情| 精品免费国产一区二区| 欧美电影免费观看| 在线视频亚洲一区| 污污网站免费看| 日韩欧乱色一区二区三区在线 | 高潮毛片7777777毛片| 国产成人av资源| 国产成人女人毛片视频在线| 亚洲黄色在线观看视频| 不卡的av电影| 欧美精品免费观看二区| 成年网站在线| **网站欧美大片在线观看| 韩国黄色一级大片| 免费看电影在线| 午夜电影网亚洲视频| 欧美一区二区三区爽大粗免费| 免费v片在线观看| 午夜精品福利久久久| 国产一区二区三区精彩视频| 午夜av成人| 在线不卡欧美精品一区二区三区| 久久久久久久高清| 欧美美女福利视频| 日韩欧美一区二区免费| 久久免费精品国产| 国产精品片aa在线观看| 色偷偷综合社区| 青青草激情视频| 夜夜爽av福利精品导航| 国产精品91久久久| 99久久精品免费看国产交换| 成人aa视频在线观看| 日本一区二区三区视频在线播放 | 激情小说亚洲色图| 国产一区二区三区视频在线观看| 顶级黑人搡bbw搡bbbb搡| 国产精品sm| 国产精品99久久久久久www| 国产又粗又猛又黄又爽| 成人丝袜18视频在线观看| 日本一区二区不卡高清更新| 手机av免费在线| 色婷婷久久久亚洲一区二区三区 | 一区二区三区 在线观看视| 黄色精品视频在线观看| 国产日韩欧美三区| 亚洲free嫩bbb| 欧美成熟毛茸茸| 亚洲欧美另类图片小说| 国产一区视频免费观看| 精品一区91| 亚洲性视频网址| 欧产日产国产v| 日韩精品亚洲专区| 国产一区自拍视频| 免费的黄网站在线观看| 欧美日韩综合视频| 黄页网站在线看| 成人av国产| 8x拔播拔播x8国产精品| www视频在线| 国产精品久久三| 国产超级av在线| 国产精品1区2区在线观看 | 国产亚洲欧美aaaa| 国产成人在线播放视频| 国产伦精品一区二区三区在线观看| 久久99精品久久久久久久久久| 国内外激情在线| 欧美亚一区二区| 国产美女喷水视频| 亚洲二区免费| 91丨九色丨国产| 黄色一级片在线观看| 色视频欧美一区二区三区| 黑丝av在线播放| 黄色欧美成人| 国产成人精品一区二区三区福利| 黄色在线免费看| 欧美美女直播网站| 貂蝉被到爽流白浆在线观看 | 97久久精品国产| 精品免费久久久| 亚洲免费在线视频一区 二区| 粉色视频免费看| 日韩大片在线| 国产日韩精品在线| av国产在线观看| 欧美优质美女网站| 成人激情五月天| 日本午夜一区二区| 三区精品视频| 国产精品4hu.www| 色婷婷av一区二区三区久久| 中文字幕人妻互换av久久| 中国av一区二区三区| 三级在线免费看| 国产精品传媒精东影业在线| 国产在线精品一区免费香蕉| 天堂地址在线www| 欧美高清性hdvideosex| 欧美第一页在线观看| 国产精品一级二级三级| 97超碰在线视| 欧美电影在线观看免费| 欧美亚洲第一页| 精品美女视频在线观看免费软件 | 久久久久久久久网站| 黄色一级a毛片| 疯狂欧美牲乱大交777| 欧美大波大乳巨大乳| 蜜臀91精品一区二区三区| 中文字幕99| 精品久久国产一区| 欧美精品激情在线观看| 日韩偷拍自拍| 欧美性受xxxx黑人xyx性爽| 波多野结衣欲乱| 福利电影一区二区| wwwxxx黄色片| 欧美电影三区| 国产传媒一区二区三区| 亚洲欧洲美洲av| 色播久久人人爽人人爽人人片视av| 国产精品毛片一区视频播| 亚洲一级二级在线| a天堂中文字幕| 国产精品一色哟哟哟| koreanbj精品视频一区| 日韩1区在线| 国产精品欧美久久| 91精品国产经典在线观看| 欧美成人精品不卡视频在线观看| 丰满少妇一级片| 日本道免费精品一区二区三区| 精品国产大片大片大片| 大陆成人av片| 中文字幕网av| 9久re热视频在线精品| 亚洲精品一区二区三区四区五区| 91成人入口| 国产精品老女人精品视频| 在线看三级电影| 国产亚洲人成a一在线v站| 午夜精品无码一区二区三区| 欧洲人成人精品| 妺妺窝人体色www在线下载| 久久久久久99精品| 不许穿内裤随时挨c调教h苏绵| 男男成人高潮片免费网站| 九一国产精品视频| 一本到12不卡视频在线dvd| 欧美日韩在线一二三| 成人在线视频你懂的| 国产日韩欧美日韩大片| 欧美激情喷水| 久久久久久69| 国内外激情在线| 国产亚洲欧美另类中文| 日中文字幕在线| 精品剧情在线观看| 国产亲伦免费视频播放| 欧美色图12p| 免费看日批视频| 香蕉加勒比综合久久| 国产极品国产极品| 国产精品久久国产精麻豆99网站| 精品人妻无码一区二区三区换脸| 成人avav影音| zjzjzjzjzj亚洲女人| 国产精品夜夜嗨| 在线观看日本一区二区| 日韩在线a电影| 日本三级免费观看| 国产欧美精品| 国产av国片精品| 国产一区二区三区四区三区四| 婷婷视频在线播放| 国产精品99久久| 中文字幕中文字幕99| 日韩欧美午夜| 一本一本久久a久久精品综合妖精| 九九在线精品| 日韩欧美一区二区三区久久婷婷| 亚洲宅男网av| 欧美一区二区在线视频观看| 日韩精品丝袜美腿| 久久99导航| 综合伊思人在钱三区| 欧美日韩电影一区二区| 精品一区在线| 亚洲国产午夜伦理片大全在线观看网站 | 丝袜视频国产在线播放| 亚洲电影免费观看| 人妻va精品va欧美va| 亚洲国产高清高潮精品美女| 黄色www视频| 精品无人区乱码1区2区3区在线| 熟妇人妻av无码一区二区三区| 亚洲激情在线观看视频免费| 神马午夜电影一区二区三区在线观看 | 精品国内亚洲2022精品成人| 国产精品麻豆免费版| 国产一区二区三区不卡av| 激情五月综合色婷婷一区二区 | 老鸭窝一区二区久久精品| 在线免费av播放| 极品美女销魂一区二区三区| 国产不卡的av| 成人手机在线视频| 中文字幕第4页| 日本一区二区三区在线观看| 肉色超薄丝袜脚交69xx图片 | 国产69精品久久久久久久久久| 精品福利在线视频| 久久久久久久久久一级| 欧美日产在线观看| 成人av无码一区二区三区| 亚洲国产精品网站| av在线天堂播放| 久久综合免费视频| 国产福利片在线观看| 国产成+人+综合+亚洲欧美丁香花| 韩国女主播一区二区| 亚洲一区二区久久久久久| 老司机成人在线| 污视频在线免费观看一区二区三区| 亚洲精品网址| 日本一道本久久| 美女一区二区三区| av电影中文字幕| 欧美经典一区二区| 久热精品在线观看| 在线视频国产一区| 亚洲爱情岛论坛永久| 亚洲人成电影网站色…| 黄在线免费观看| 欧美一区二区视频97| 成人亚洲精品| 欧美精品v日韩精品v国产精品| 亚洲啊v在线观看| 国内外免费激情视频| 国产经典欧美精品| 免费观看av网站| 一区二区三区四区精品在线视频| 91精品国产高清一区二区三密臀| 制服.丝袜.亚洲.另类.中文| 四虎影视在线观看2413| 久久国产精品久久久| 影音成人av| 精品视频一区在线| 综合在线一区| 三级a三级三级三级a十八发禁止| 99久久er热在这里只有精品15 | 黄色小视频在线观看| 色综合久综合久久综合久鬼88 | 欧美日韩一区二区不卡| 午夜视频在线免费播放| 美女av一区二区三区| 国产精品亚洲一区二区三区在线观看| 成人一区二区三区四区| 偷偷www综合久久久久久久| 一级特黄性色生活片| 91网上在线视频| 久草视频精品在线| 欧美一区二区三区四区在线观看| 国产精品视频一区二区久久| 91精品国产91久久久久久久久 | 日韩免费性生活视频播放| 第九色区av在线| 国产suv精品一区二区三区88区| 成人春色在线观看免费网站| 黄黄视频在线观看| 九色综合国产一区二区三区| 国产美女永久免费无遮挡| 狠狠久久亚洲欧美专区| 搡老岳熟女国产熟妇| 午夜精品国产精品大乳美女| 91成人精品在线| 黄色一级片在线看| 成人黄色av网站在线| 国产亚洲精品久久久久久无几年桃 | k8久久久一区二区三区 | 国产一区二中文字幕在线看| av一区二区在线播放| 成年人在线看片| 久久久久久久久97黄色工厂| 国产亚洲欧美一区二区 | 欧美性色aⅴ视频一区日韩精品| 亚洲欧洲成人在线| 欧美亚洲另类在线| 亚洲电影一级片| 91九色在线观看视频| 26uuu亚洲婷婷狠狠天堂| 亚洲永久精品在线观看| 日韩成人中文字幕| 超级碰碰久久| 色噜噜狠狠色综合网| 日本欧美一区二区三区乱码| 五月天婷婷丁香网| 欧美疯狂性受xxxxx喷水图片| 日本最黄一级片免费在线| 国产日韩在线看片| 你懂的国产精品永久在线| 美女日批在线观看| 精品免费在线视频| 九一在线视频| 国产一区视频在线| 欧美精品18| 日本黄色片在线播放| 在线亚洲人成电影网站色www| 在线免费看a| 91久久久在线| 在线看片欧美| 中文字幕在线1| 欧美日韩大陆一区二区| 污片视频在线免费观看| 久久伦理网站| 另类小说综合欧美亚洲| 欧美日韩亚洲国产另类| 亚洲精品电影网| 日本精品裸体写真集在线观看| 艳色歌舞团一区二区三区| 国产成人aaa| 高清乱码免费看污| 日韩在线观看成人| 9999久久久久| 亚洲视频在线观看一区二区三区| 亚洲视频网在线直播| 五月天激情婷婷| 国产女精品视频网站免费| 亚洲五月婷婷| 国产无遮挡在线观看| 精品久久一区二区| 成人在线免费电影网站| 91动漫在线看| 欧美激情一区二区三区在线| www国产在线| 国产精品成人品| 亚洲高清久久| 99热6这里只有精品| 亚洲国产一区二区三区在线观看| 黄色欧美视频|