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

av女名字大全列表| 青春草免费视频| а√天堂资源国产精品| 国产欧美精品一区二区色综合| 国产精品国语对白| 人人艹在线视频| 99亚洲乱人伦aⅴ精品| 精品高清美女精品国产区| 日本中文不卡| 99热这里只有精| 久久国产精品久久久久久电车| 中文字幕欧美专区| 99久久久无码国产精品性波多| 大胆人体一区| 亚洲中国最大av网站| 久久精品一区二区三区不卡免费视频| 一区二区视频在线免费观看| 亚洲第一黄网| www.日韩系列| 熟女少妇一区二区三区| 日本一区影院| 欧美日韩一区视频| 色综合久久久久无码专区| 米奇777四色精品人人爽| 成人动漫一区二区| 91精品国产自产在线观看永久| 国产成人愉拍精品久久| 综合日韩在线| 中文国产亚洲喷潮| 爱爱的免费视频| 国产精品对白久久久久粗| 欧美日本视频在线| 992kp快乐看片永久免费网址| 福利成人导航| 日韩一区日韩二区| 亚洲一区二区三区精品在线观看| 深夜福利免费在线观看| 成人丝袜18视频在线观看| 91人成网站www| 中文字幕av在线免费观看| 亚洲在线日韩| 91国内在线视频| 国产一级片播放| 你懂的国产精品| 久久天天躁狠狠躁夜夜爽蜜月| 无码 人妻 在线 视频| 天堂俺去俺来也www久久婷婷| 日韩三级电影网址| 特种兵之深入敌后| 伊人久久一区| 91精品国产综合久久婷婷香蕉| 午夜两性免费视频| 国产一区精品福利| 欧美三级在线播放| 精品亚洲一区二区三区四区| 成人涩涩视频| 欧美日韩成人综合在线一区二区 | 亚洲最新色图| 色偷偷av一区二区三区| 久久精品国产亚洲AV成人婷婷| 国产一区不卡| 在线视频日本亚洲性| www色com| 久久久精品久久久久久96| 视频直播国产精品| 91n在线视频| 你懂的网址国产 欧美| 久久99久久99精品中文字幕| 国产亚洲色婷婷久久99精品| 亚洲三级视频| 国产va免费精品高清在线观看| 天天综合天天干| 视频一区二区三区在线| 国产区精品在线观看| 国产一区二区网站| 国产精品羞羞答答xxdd| 国产一区二区高清不卡| 日韩有码电影| 国产精品久久影院| 台湾无码一区二区| 中文在线免费二区三区| 欧美在线视频你懂得| 中文字幕在线视频一区二区三区| 亚洲精品一区二区三区中文字幕| 亚洲国产第一页| 久久久久久久久久久国产精品| 欧美日韩有码| 欧美黑人巨大精品一区二区| 国产又大又黄视频| 另类成人小视频在线| 99久久综合狠狠综合久久止| 欧美中文在线| 亚洲精品视频观看| 一本大道熟女人妻中文字幕在线| 粉嫩av一区二区三区四区五区| 日韩欧美一区二区久久婷婷| 中文精品在线观看| 亚洲h色精品| 91精品国产自产91精品| 一区二区三区日| 99精品久久免费看蜜臀剧情介绍| 欧美日韩在线播放一区二区| 国产在线观看91| 欧美性xxxx极品hd满灌| 欧美一级免费在线| 九九久久婷婷| 欧美高清视频在线| 中文字幕精品一区二区精| 粉嫩av一区二区三区在线播放| 日韩久久不卡| sm久久捆绑调教精品一区| 欧美日韩亚洲综合| 中文字幕xxx| 亚洲性视频h| 川上优av一区二区线观看| 水中色av综合| 亚洲少妇30p| 色一情一乱一伦一区二区三区日本| 欧州一区二区三区| 中文字幕亚洲一区二区三区五十路 | 国产欧美一区二区三区米奇| 丝袜亚洲另类欧美重口| 久久99精品波多结衣一区| 国产精品自拍在线| 亚洲欧美久久234| 成人免费网站观看| 日韩欧美电影一区| 小早川怜子一区二区的演员表| 久久激情视频| 精品免费日产一区一区三区免费| 影院在线观看全集免费观看| 欧美性一区二区| 新91视频在线观看| 国产精品日韩欧美一区| 国产精品国产精品国产专区蜜臀ah| 国产福利电影在线| 一本大道久久a久久精品综合| 成人午夜精品无码区| 国产一区日韩欧美| 电影午夜精品一区二区三区| 影院在线观看全集免费观看| 337p亚洲精品色噜噜狠狠| 香蕉久久久久久久| 蜜臀a∨国产成人精品| 日本视频一区二区不卡| 午夜影院在线播放| 亚洲精品动漫100p| 日本三级小视频| 91免费版在线看| 欧美性久久久久| 你懂的在线观看一区二区| 久久久久中文字幕2018| 亚洲第一色视频| 亚洲综合精品自拍| www男人天堂| 国产欧美在线| 欧美极品一区二区| 粉嫩一区二区三区| 国产亚洲福利一区| 最近中文字幕免费在线观看| 亚洲国产精品99久久久久久久久| 波多野结衣天堂| 婷婷亚洲五月| av在线不卡观看| 国产高清在线a视频大全 | 中文字幕1区2区| 亚洲大胆视频| 欧美三级华人主播| 激情久久一区二区| 美女久久久久久久| 人妻无码中文字幕| 在线观看日韩一区| 波多野结衣久久久久| 国产成人自拍网| 丁香花在线影院观看在线播放| 色综合久久中文| 国产精品视频男人的天堂| 黄色网在线免费观看| 精品少妇一区二区三区免费观看 | 国产极品在线观看| 亚洲天堂av高清| 国产精品欧美激情在线| 亚洲国产中文字幕在线视频综合 | 97激碰免费视频| 你懂的视频在线| 欧美乱妇23p| 日韩av一二三区| 欧美激情中文字幕一区二区| 黄色一级片免费播放| 国产亚洲在线| 一区二区视频在线播放| 国产精品白丝一区二区三区| 国产精品免费久久久久影院| 欧美人与牲禽动交com| 亚洲精品日韩久久久| 国产露脸国语对白在线| 欧美视频在线观看免费网址| 免费看一级大片| 久久网站热最新地址| 亚洲一区日韩精品| 国产欧美短视频| 国产又粗又硬又长| 国产一区二区三区日韩精品| 91久久大香伊蕉在人线| 性欧美videohd高精| 久久久久成人网| 网友自拍视频在线| 国产手机视频精品| 午夜久久久久久噜噜噜噜| 欧美天堂一区二区三区| 日韩乱码在线观看| 伊人一区二区三区| xxxx日本免费| av激情综合网| 免费观看黄网站| 免费视频最近日韩| 动漫av网站免费观看| 欧美日韩一区二区国产| 一区二区三区视频在线播放| 亚洲+变态+欧美+另类+精品| 91福利视频导航| 亚洲精品第一| 国产精品成人av性教育| 日韩激情电影| 欧美激情综合亚洲一二区| 黄网站免费在线观看| 一区二区三区亚洲| 美女欧美视频在线观看免费| 亚洲国产高清高潮精品美女| 国产人妻精品一区二区三区| 欧美日韩中文另类| 一级片在线免费播放| 欧美性高潮在线| 99热只有这里有精品| 亚洲二区在线视频| 久久av高潮av无码av喷吹| 亚洲日本在线a| 在线观看亚洲网站| 一区在线播放视频| 永久免费观看片现看| 国产欧美综合在线观看第十页| 一本色道综合久久欧美日韩精品| 成人性生交大片免费看视频在线| 麻豆精品国产传媒| 国产成人欧美日韩在线电影| 91网址在线观看精品| 国产乱码精品一区二区三区五月婷 | 变态调教一区二区三区| 欧美成人免费va影院高清| av文字幕在线观看| 欧美理论电影在线观看| xvideos国产在线视频| 欧美成人免费小视频| 大香伊人久久| 午夜美女久久久久爽久久| √天堂8资源中文在线| 久久久久久国产| 免费h视频在线观看| 欧美在线www| 88xx成人网| 91在线视频九色| 亚洲精品观看| 久久精品综合一区| 激情综合网站| 亚洲精蜜桃久在线| 99精品在线观看| 国产在线视频综合| 国产精品一区亚洲| 亚洲最大成人在线观看| 国产美女视频91| 中文字幕乱码在线| 久久久www成人免费毛片麻豆 | 国产精品欧美一区二区| 四虎影视精品永久在线观看| 97人人干人人| 亚洲另类春色校园小说| 欧美日韩中文国产一区发布| 久久蜜桃av| 91黄色在线看| 日本成人中文字幕| 人妻巨大乳一二三区| 99久久99久久久精品齐齐| 夫妇交换中文字幕| 一区二区三区精密机械公司| www.国产色| 欧美美女直播网站| 人妻一区二区三区| 在线播放国产精品| 激情网站在线| 国产精品久久久久9999| 97视频一区| 日韩一区二区三区资源| 欧美激情自拍| 黄色一级大片在线观看| 国产精品一二三区在线| 人人妻人人藻人人爽欧美一区| 亚洲天堂久久久久久久| 国产又黄又爽又色| 69久久99精品久久久久婷婷 | 国产精品无码一区二区在线| 蜜臀av一区二区在线观看| 大尺度做爰床戏呻吟舒畅| 国产精品乱码妇女bbbb| 欧美三级韩国三级日本三斤在线观看| 精品污污网站免费看| 天天干视频在线观看| 日韩中文字幕网址| 国产夫妻在线播放| 2020国产精品久久精品不卡| 国产调教一区二区三区| 国产日韩av网站| 国内成人精品2018免费看| 精品人妻一区二区三区香蕉 | 一级成人黄色片| 日韩女优制服丝袜电影| 成人在线免费视频| 91国内在线视频| 国产精品xxx在线观看| 妞干网这里只有精品| 免费成人你懂的| 3d动漫精品啪啪一区二区下载| 亚洲日本一区二区| 亚洲天堂aaa| 在线成人激情黄色| 在线视频cao| 九色91视频| 99riav国产精品| 熟妇高潮一区二区| 一区二区三区精品久久久| 国产强被迫伦姧在线观看无码| 夜夜嗨av一区二区三区四区 | 午夜时刻免费入口| 精品免费在线观看| 日韩一区二区三区在线观看视频| 麻豆乱码国产一区二区三区 | 日韩一区二区三区电影在线观看 | 亚洲丝袜制服诱惑| 中文字幕日产av| 伊人久久大香线蕉av一区二区| 中老年在线免费视频| 免费久久一级欧美特大黄| 国产婷婷精品| 国产黄色网址在线观看| 欧美丝袜第一区| 日本国产在线| 日韩女优人人人人射在线视频| 竹菊久久久久久久| av天堂永久资源网| 久久久精品天堂| 国产三级理论片| 色偷偷噜噜噜亚洲男人的天堂| yiren22亚洲综合| 国产精品av免费| 激情综合一区二区三区| 久草综合在线视频| 欧美刺激午夜性久久久久久久| 黄色影院在线看| 蜜桃麻豆91| 日本中文字幕一区| 99久久精品久久亚洲精品| 正在播放亚洲一区| 国产传媒在线播放| 国产精品一 二 三| 校园激情久久| 久久久久亚洲AV成人无在 | 色婷婷在线视频| 欧美亚洲视频在线观看| 激情婷婷综合| 91热视频在线观看| 亚洲大片在线观看| 国产综合在线观看| 成人高清视频观看www| 欧美黄在线观看| 波多野结衣视频播放| 在线欧美日韩国产| 超鹏97在线| 久久久久久精| 九一九一国产精品| 日本五十熟hd丰满| 国产一区二区三区三区在线观看 | 日韩一区二区三区四区在线| 亚洲成人精品在线| 欧美va在线| 91视频 - 88av| 国产日韩欧美精品在线| 精品国产18久久久久久| 欧美在线一级视频| 天天做天天爱天天综合网| www国产视频| 欧美二区三区91| 欧美另类老肥妇| 黄色一级片网址| 久久综合精品国产一区二区三区| 怡红院男人天堂| 久久青草福利网站| 日韩久久精品| 久久人人爽人人爽人人片| 91精品国产欧美一区二区成人| 亚洲一区资源| 欧美激情亚洲天堂|