国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

分享.net常見的內存泄露及解決方法

開發 后端
本文討論的是.NET內存泄漏的問題,介紹了常見的內存泄漏和解決的辦法,介紹的很詳細,希望對你有幫助,一起來看。

關于內存泄漏的問題,之前也為大家介紹過,比如:檢測C++中的內存泄漏,是關于C++內存泄漏的。今天為大家介紹的是關于.NET內存泄漏的問題。

前段時間幫項目組內做了一次內存優化,產品是使用c#開發的winForm程序,一直以為.net提供了垃圾收集機制,開發的時候也沒怎么注意內存的釋放,導致最后的產品做出來之后,運行一個多小時就內存直接崩潰了,看來.net的垃圾收集還是得需要開發者加以控制,也不是萬能的啊。

下面將對垃圾收集做以簡介,然后描述一下我在內存優化過程中常見的內存泄露及解決方法。

托管堆的內存分配(下文中的托管堆指的是GC堆)

托管堆是以應用程序域為依托的,即每一個應用程序域有一個托管堆,每一個托管堆也只屬于一個應用程序域,且托管堆是一塊連續的內存,其中的對象也是緊密排列的。相對于C++中的非連續內存堆來說,托管堆的內存分配效率要高。托管堆維護了一個指針,指向當前已使用內存的末尾,當需要分配內存的時候,只需要指針向后移動指定數量的位置即可。而且托管堆通過應用程序域實現了應用程序之間內存的隔離,即不同的應用程序域之間在正常情況下是不能相互訪問各自的托管堆的。

垃圾收集

垃圾收集的算法有很多。例如引用計數、標記清除等等,托管堆使用的標記清除算法。

托管堆使用的是分代標記清除算法。

標記清除算法

首先,系統將托管堆內所有的對象視為可以回收的垃圾,然后系統從GCRoot開始遍歷托管堆內所有的對象,將遍歷到的對象標記為可達對象,在遍歷完成之后,回收所有的非可達對象,完成一遍垃圾收集。

注意,托管堆的垃圾收集只會自己收集托管對象!

由于在執行完垃圾收集之后,托管堆中會產生很多的內存碎片,導致內存不再連續,因此在垃圾收集完成之后,系統會執行一次內存壓縮,將不連續的內存重新排列整齊,變成連續的內存。(關于垃圾收集的詳細信息,大家可以參考《CLR Via C#》)

通過上面的簡述,大家都知道什么樣的對象不會被收集,即能從GCRoot開始遍歷到的對象。

最常見的GCRoot是線程的棧,線程的棧里面通常包含方法的參數、臨時變量等。另外常見的GCRoot還有靜態字段、CPU寄存器以及LOH堆上的大的集合。因此,如果想要讓托管對象的內存順利的釋放,只需要斷開與跟之間的聯系即可。而對于非托管對象的內存,必須進行手動釋放。

下面我根據自己在優化內存的過場中的一些常見錯誤以及一些解決方法。

事件

在.net內存泄露的原因當中,事件占據了非常大的一部分比例,事件是一種委托的實例,也就是與我們類中其他的字段一樣,也是一個字段。

委托為什么能阻止垃圾收集呢?即委托是如何讓相關的對象在垃圾收集的時候被標記為可達對象的呢?首先要從委托的本質看起,

我們通常使用的委托是從類

  1. public abstract class MulticastDelegate : Delegate 

繼承的,MulticastDelegate內部維護了一個private object _invocationList;,即我們通常所有的委托鏈(ps:委托鏈同字符串一樣,是不可變的),這個委托鏈是以個object [],內部保存了Delegate對象,及每一個委托實際上是一個Delegate對象,而Delegate包含了兩個非常重要的字段:

  1. internal object _target;  
  2. internal object _methodBase; 

其中_target就是訂閱事件的對象,_methodBase則是訂閱事件的方法的 MethodInfo。其關聯關系如下例所示:

  1. Code:  
  2. public event EventHandler TestEvent;  
  3. void MethodEndTempVarClear()  
  4. {  
  5. Test tempTestEvent = new Test();  
  6. TestEvent += tempTestEvent.TestEvent;  

我們假設此段代碼所在的對象即為一個可達的對象,則其引用關系如下圖所示:

引用關系圖 

由上圖我們可以看出,原本應該在方法結束后就可以變為不可達對象的tempTestEvent變成了可達對象,因此也不能對其進行收集了。

個人建議:將類中所有的事件訂閱添加到一個專門的方法當中,且實現一個與其匹配的取消訂閱的方法,并在必要的時候,調用取消訂閱的方法。

非托管對象

非托管對象無論在什么時候,都不會被垃圾收集所回收,必須手動釋放。

.net中的非托管資源都實現了IDispose接口,我們可以在使用的時候,使用using(){}類實現非托管資源的釋放。

其中有一種情況非常容易遺漏,即通過一個方法創建了一個非托管的對象,如下所示:

  1. public MemoryStream CreateAStream()  
  2. {  
  3. return new MemoryStream();  

大家在使用的時候非常容易遺忘通過這種方法的形式創建的非托管對象,尤其是一些名字意義表達不準確的時候,例如

  1. var temp = CreateATemp();//CreateATemp返回一個非托管對象 

大家可能會漏掉對temp的內存釋放,因此建議大家盡量少用方法創建或者初始化非托管對象,如果需要,則使用如下的方式:

  1. bool InitializeStream(out MemoryStream stream)  
  2. {  
  3. stream = new MemoryStream();  
  4. return true;  

即使用out關鍵字,這樣大家在使用這個方法的時候,需要首先聲明相關的非托管對象,可以在使用完成之后,及時的釋放,減少遺漏。

集合/靜態字段

對于集合,我們在使用完成之后,需要即時的clear,尤其是將一些方法中的臨時變量添加到集合當中之后,會導致集合膨脹,并使得其中的內存泄露。

對于靜態字段,我們應該盡量減少其可見的域,因為靜態字段在整個程序運行期間都不會被釋放,減少其可見域就減少了其內存泄露的可能性,注意,不到萬不得以,千萬不要聲明靜態的集合,就是使用了,那也一定要小心再小心。靜態集合很容易造成內存泄露。

最好,大家有什么好的建議后者方法,歡迎補充!!

【編輯推薦】

  1. 檢測C++中的內存泄漏
  2. 為什么重復free()比內存泄漏危害更大
  3. JVM內存泄漏問題產生及檢測方案
  4. Java內存泄漏及檢測方法
  5. 深入淺出JavaScript內存泄漏
責任編輯:于鐵 來源: 狩月的博客
相關推薦

2010-08-10 10:10:34

Flex內存泄露

2010-08-12 09:30:08

Flex內存泄露

2018-07-17 08:58:57

垃圾回收內存泄露方法

2010-07-29 14:08:05

Flex內存泄露

2011-05-06 17:25:58

硒鼓

2011-04-29 13:22:48

ThinkPad筆記本故障

2022-04-06 10:09:17

云服務云計算

2010-01-19 18:37:24

VB.NET內存占用

2018-05-29 11:44:22

數據庫MySQL死鎖

2012-11-19 11:30:40

PowerShell常見問題解決方法

2021-06-17 08:07:35

Linux 內存站崗

2009-08-24 10:37:11

Silverlight

2018-11-01 15:26:38

開源軟件安全

2010-08-31 09:13:00

margin-top

2009-03-04 10:38:36

Troubleshoo桌面虛擬化Xendesktop

2010-08-31 13:49:12

CSS

2025-04-07 07:20:35

SQL慢查詢性能

2021-04-20 11:03:26

人工智能AI機器學習

2012-08-15 14:01:18

2010-03-25 10:06:57

CentOS配置
點贊
收藏

51CTO技術棧公眾號

亚洲国产一区二区三区在线| 香蕉成人伊视频在线观看| 黄色片在线免费观看| 亚洲美女在线看| 欧美私人啪啪vps| 成色在线视频| 日本aⅴ大伊香蕉精品视频| 黄色日韩在线| 中文在线天堂网| 国产精品极品美女在线观看| 亚洲一品av免费观看| 欧美理论电影在线精品| 亚洲va码欧洲m码| 国产麻豆精品95视频| 激情婷婷综合网| 一区二区三区精品| av色综合久久天堂av色综合在| 国产精品一区二区久久| 日韩高清专区| 久久精品色图| 欧美肥老太太性生活| 亚洲青青青在线视频| 欧美激情精品久久久久久蜜臀| 色欲色香天天天综合网www| 波多野结衣在线观看| 国产美女精品| 欧美在线小视频| 成人福利在线观看| 屁屁影院在线观看| 日产精品一区二区| 亚洲国产视频a| 国产精品久久久久久搜索| 免费高清视频日韩| 亚洲动漫精品| 一区二区三区视频在线看| 日本老师69xxx| 毛片中文在线观看| 欧美日韩性在线观看| 亚洲综合丝袜美腿| 国产精品高潮呻吟久久av黑人| 色婷婷av金发美女在线播放| 欧美电影在线观看完整版| 国产精品久久久99| 91爱视频在线| 高清av影院| 不卡av一区二区| 婷婷国产v国产偷v亚洲高清| 91美女片黄在线观| 高清毛片在线看| 一本久久知道综合久久| 51精品秘密在线观看| 久久综合久久久| 影音先锋男人资源在线| 免费一区二区视频| 国产剧情av麻豆香蕉精品| 亚洲精品av在线播放| 一区二区在线观看网站| 日本久久免费| av亚洲精华国产精华精| 久久精品国产亚洲7777| 丁香啪啪综合成人亚洲| 亚洲网一区二区三区| 国产精品素人一区二区| 日韩av不卡在线| 亚洲网站情趣视频| 欧美国产三级| 91精品免费在线| 一区二区三区四区不卡| 中文字幕在线免费观看视频| 丰满放荡岳乱妇91ww| 久久久成人精品| 亚洲一级免费在线观看| 色综合综合网| 色狠狠色噜噜噜综合网| 欧美一区二区三区四区夜夜大片| 欧美一级鲁丝片| 91亚洲精品乱码久久久久久蜜桃| 欧美丰满少妇xxxxx| 国产一级视频| 欧美精品一卡| 欧美大片在线观看一区二区| 日韩精品一区二区三区电影| 日韩五码电影| 成人欧美一区二区三区| 成人网址在线观看| а√天堂官网中文在线| 国产精品123| 草民午夜欧美限制a级福利片| av天天在线| 亚洲性色视频| 亚洲精品视频在线播放| 999精品视频在线| 精品日韩一区| 欧美精品视频www在线观看| 一区二区三区四区视频在线观看| 日韩成人综合网| 亚洲激情男女视频| 久久精品亚洲热| 国产999在线观看| 黄网站在线观看| 日韩成人一级大片| 北条麻妃一区二区三区中文字幕| 国产一级电影网| 亚洲欧美成人综合| 在线播放日韩专区| 国产色视频网站| 国产综合欧美| 亚洲男人天堂网| 第四色亚洲色图| 欧美三级不卡| 亚洲天堂免费视频| 人人澡人一摸人人添| 欧美激情日韩| 亚洲丝袜av一区| a√免费观看在线网址www| 欧美日本久久| 亚洲欧美在线看| 美女网站色免费| 欧美国产91| 亚洲男人天天操| 黑巨人与欧美精品一区| 国产乱码精品| 久久影视免费观看| 亚洲欧洲成人| 精品亚洲aⅴ乱码一区二区三区| 欧美俄罗斯性视频| 国产精品一二三区视频| 国产福利不卡视频| 国产精品爽爽爽爽爽爽在线观看| 在线不卡日本v二区707| 国产日韩欧美制服另类| 99久久99久久| 偷拍精品精品一区二区三区| 亚洲精品中文在线观看| 日本在线视频不卡| 77成人影视| 欧美久久久影院| 97视频在线免费播放| 国产精品www994| 北条麻妃久久精品| 国产精品一级伦理| 91麻豆免费在线观看| 91久久国产综合久久蜜月精品 | 国产美女久久| 精品福利视频导航| 欧美另类videos| 欧洲激情综合| 日韩久久精品成人| igao视频网在线视频| 国产中文字幕精品| 国产精品一区二区电影| 高清av不卡| 红桃视频成人在线观看| 国产91在线亚洲| 99精品小视频| 中文字幕v亚洲ⅴv天堂| 人操人视频在线观看| 日韩中文字幕在线一区| 久久91视频| 日韩大尺度黄色| 9191在线播放| 美国成人av| 无码aⅴ精品一区二区三区浪潮 | 国产电影一区| 色综合久久综合| 免费看毛片的网址| 欧美成人69| 欧美精品在线播放| 天天综合视频在线观看| 国产午夜精品一区二区三区视频| 激情五月综合色婷婷一区二区| 日日夜夜精品视频| 欧美一卡2卡三卡4卡5免费| 1024亚洲| 国内精品久久久久影院薰衣草| 国产主播喷水一区二区| 黄色成人小视频| 欧美三级日本三级少妇99| av天堂永久资源网| 亚洲欧美网站| 亚洲mv在线观看| 欧美精品第一页| 在线不卡欧美精品一区二区三区| 欧美三级在线播放| 亚洲精品国产一区二区三区四区在线| 九九九久久久久久| 哥也色在线视频| 亚洲黄色小说网站| 精品视频在线观看一区二区| 亚洲电影影音先锋| 最近免费中文字幕视频2019| 男人和女人做事情在线视频网站免费观看 | 国产综合在线看| 午夜伦理在线视频| 亚洲视频免费在线| avav在线播放| 免费日韩视频| 91精品久久久久久久久久久| 57pao成人永久免费| 日韩欧美的一区|