最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET資源泄露與處理方案知識點分享

 更新時間:2019年11月24日 11:29:05   作者:布道閣  
在本篇文章里小編給大家整理的是關(guān)于.NET資源泄露與處理方案內(nèi)容,有需要的朋友們可以參考下。

.NET雖然擁有強大易用的垃圾回收機制,但并不是因為這樣,你就可以對資源管理放任不管,其實在稍不注意的時候,可能就造成了資源泄露,甚至因此導致系統(tǒng)崩潰,到那時再來排查問題就已經(jīng)是困難重重。

一、知識點簡單介紹

常見的資源泄露有:

  • 內(nèi)存泄漏:非托管資源沒有釋放、非靜態(tài)對象注冊了靜態(tài)實例。
  • GDI泄露:字體。
  • 句柄泄露:Socket或線程。
  • 用戶對象泄露:移除的對象未釋放。

二、具體實例

1. 內(nèi)存泄漏

很常見的現(xiàn)象是分不清哪些對象需要釋放,對于控件、Stream等一些非托管資源也只管新增,卻沒有釋放,功能是實現(xiàn)了,卻埋了顆不小的雷。

private void button1_Click(object sender, EventArgs e)
{
 for(int i=0;i<1000;i++)
 this.Controls.Add(new TabPage());
}
private void button1_Click(object sender, EventArgs e)
{
 new Form2.ShowDialog();
}

如果你覺得寫這樣的代碼很Cool,很簡潔,你在項目中也有這么寫代碼,那你就碰到大麻煩了,你試試在上面Form2中開個大一點的數(shù)組來檢查內(nèi)存,然后運行,按幾下按鈕,你就會發(fā)現(xiàn),內(nèi)存一直增加,即使你調(diào)用了GC也無濟于事。所以,對于此類非托管資源要記住釋放,用完即廢可以采用using關(guān)鍵字。

public Form2()
{
 InitializeComponent();
 MyApp.FormChanged += FormChanged;
}

上面這個例子中,MyApp是一個靜態(tài)類,如果在實例對象中向這種類里面注冊了事件,而又沒有取消注冊,這樣也會遇到大麻煩,即使在外部已經(jīng)記得調(diào)用了Form2的Dispose也是沒用的。

解決方案

  • 注意托管資源和非托管資源的釋放區(qū)別,非托管資源是需要手動釋放的。
  • 使用using關(guān)鍵字,避免忘記Dispose的情況,如上面的ShowDialog問題。(using中還起到了try-catch的作用,避免由于異常未調(diào)用Dispose的情況)
  • 使用UnLoad事件或者析構(gòu)函數(shù),對注冊的全局事件進行取消注冊。
  • 特別注意自定義組件的穩(wěn)定性更重要,發(fā)生問題時影響也更廣。注意繼承IDisposable接口,進行資源釋放

2. GDI泄露

一般會跟字體相關(guān),例如我曾在Android上用Cocos2d做一個小游戲時頻繁地切換字體、Dev控件的Font屬性賦值也會有這種現(xiàn)象。

XXX.Font = new Font(...)

解決方案

這個問題我目前是采用字體池來解決,類似線程池的概念,相同Key值取同一個對象。若有更好方案歡迎留言討論

3. 句柄泄露

一般跟Socket和Thread(線程)有關(guān)

for(int i=0;i<1000;i++){
 new Thread(()=>{
 Thread.Sleep(1000);
 }).Start();
}

解決方案

  • Socket的場景暫時沒遇到。
  • 線程問題采用線程池相關(guān)的輔助類能有效解決,例如ThreadPool、Task、Parallel。

4. 用戶對象泄露

一般跟移除的對象未釋放有關(guān)

private void button1_Click(object sender, EventArgs e)
{
 tab.Remove(tabPage);
}

三、最后特別奉送一個內(nèi)存釋放的大招

[DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
/// <summary> 
/// 釋放內(nèi)存 
/// </summary> 
public static void ClearMemory()
{
 GC.Collect();
 GC.WaitForPendingFinalizers();
 if (Environment.OSVersion.Platform == PlatformID.Win32NT)
 {
 SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
 }
}

調(diào)用以上API能讓你的內(nèi)存一下爆減,是不是很給力,一調(diào)用內(nèi)存就降下來了。But,先別高興太早,這其實是偽釋放,只是暫時解決內(nèi)存大量泄漏導致系統(tǒng)崩潰的應(yīng)急處理方案。具體原因參考:SetProcessWorkingSetSize函數(shù)的騙局,關(guān)鍵信息:物理內(nèi)存轉(zhuǎn)虛擬內(nèi)存,涉及磁盤讀寫。好處壞處都貼出來了,是否需要使用請君自己斟酌。

四、總結(jié)

實際上由于各個開發(fā)人員的水平跟接觸面不同,又沒有經(jīng)過統(tǒng)一的培訓(各個人對資源釋放的理解與關(guān)注度不同,或者寫代碼時就沒考慮內(nèi)存未被釋放這種問題),發(fā)現(xiàn)問題的時候項目往往已經(jīng)做到了一個階段,系統(tǒng)也比較龐大了,這種時候才發(fā)現(xiàn)內(nèi)存泄露的問題確實是很頭疼的。

資源泄露的場景往往是相互關(guān)聯(lián)的,發(fā)生最多的就是內(nèi)存泄漏,而除了寫法可能有問題外,也可能是因為句柄泄露或用戶對象泄露引起的。

參考文章:

C#中event內(nèi)存泄漏總結(jié)

C# 字體池技術(shù)實現(xiàn)

以上就是本次介紹的全部相關(guān)知識點,感謝大家的學習和對腳本之家的支持。

您可能感興趣的文章:

相關(guān)文章

  • Log4Net配置詳解及輸出自定義消息類示例代碼

    Log4Net配置詳解及輸出自定義消息類示例代碼

    這篇文章主要介紹了Log4Net配置詳解及輸出自定義消息類示例代碼,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Attribute/特性心得隨筆

    Attribute/特性心得隨筆

    從事asp.net工作的相關(guān)人員對Attribute并不陌生吧,本文就來為大家介紹下Attribute特性,下面有個不錯的示例,喜歡的朋友感受下
    2013-11-11
  • 在一個網(wǎng)站下再以虛擬目錄的方式掛多個網(wǎng)站的方法

    在一個網(wǎng)站下再以虛擬目錄的方式掛多個網(wǎng)站的方法

    在一個網(wǎng)站下再以虛擬目錄的方式掛N個網(wǎng)站的方法
    2010-04-04
  • WPF數(shù)據(jù)驅(qū)動修改綁定

    WPF數(shù)據(jù)驅(qū)動修改綁定

    這篇文章介紹了WPF數(shù)據(jù)驅(qū)動修改綁定的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • asp.net正則表達式刪除指定的HTML標簽的代碼

    asp.net正則表達式刪除指定的HTML標簽的代碼

    抓取某網(wǎng)頁的數(shù)據(jù)后(比如描述),如果照原樣顯示的話,可能會因為它里面包含沒有閉合的HTML標簽而打亂了格式,也可能它里面用了比較讓人 費解 的HTML標簽,把預訂的格式攪亂.
    2010-09-09
  • .Net?WebApi中實現(xiàn)自動依賴注入的三種方法(最新推薦)

    .Net?WebApi中實現(xiàn)自動依賴注入的三種方法(最新推薦)

    依賴關(guān)系注入 (DI) ,是一種軟件設(shè)計模式,這是一種在類及其依賴項之間實現(xiàn)控制反轉(zhuǎn) (IoC)?的技術(shù), .NET 中的依賴關(guān)系注入是框架的內(nèi)置部分,與配置、日志記錄和選項模式一樣,這篇文章主要介紹了.Net?WebApi中實現(xiàn)自動依賴注入的三種方法,需要的朋友可以參考下
    2024-03-03
  • ASP.NET Mvc開發(fā)之刪除修改數(shù)據(jù)

    ASP.NET Mvc開發(fā)之刪除修改數(shù)據(jù)

    這篇文章主要介紹了ASP.NET Mvc開發(fā)中的刪除修改數(shù)據(jù)功能,感興趣的小伙伴們可以參考一下
    2016-03-03
  • ASP.NET MVC后臺參數(shù)驗證的幾種方式

    ASP.NET MVC后臺參數(shù)驗證的幾種方式

    本篇文章主要介紹了ASP.NET MVC后臺參數(shù)驗證的幾種方式 ,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • 使用Lucene.NET實現(xiàn)站內(nèi)搜索

    使用Lucene.NET實現(xiàn)站內(nèi)搜索

    提到Lucene,想必大家都有所耳聞,已經(jīng)是數(shù)年前就出現(xiàn)的開源技術(shù)。很多站點都是利用它搭建自己網(wǎng)站的站內(nèi)搜索。由于最近也在做數(shù)據(jù)檢索方面的東西,也學習了下Lucene.net的使用。
    2015-06-06
  • .Net項目中一些常用驗證操作

    .Net項目中一些常用驗證操作

    這篇文章主要為大家詳細介紹了.Net項目中一些常用驗證操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論

扶风县| 汕头市| 莲花县| 邯郸县| 曲阜市| 子长县| 水富县| 和田市| 平塘县| 赫章县| 武隆县| 万年县| 多伦县| 邯郸县| 易门县| 郧西县| 巴林右旗| 临海市| 邯郸县| 广元市| 远安县| 吉林省| 定边县| 长乐市| 偏关县| 武功县| 安吉县| 和硕县| 扎囊县| 连江县| 思南县| 兰西县| 湘乡市| 张家港市| 阜康市| 奉贤区| 上高县| 惠来县| 黄浦区| 浠水县| 泾川县|