亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

.NET中常見的內存泄漏和解決辦法

2019-11-14 15:55:51
字體:
來源:轉載
供稿:網友

 

在.NET中,雖然CLR的GC垃圾回收器幫我們自動回收托管堆對象,釋放內存,最大程度避免了"內存泄漏"(應用程序所占用的內存沒有得到及時釋放),但.NET應用程序"內存泄漏"的問題還是會存在,如果不加以注意,"內存泄漏"時有發生。


有關流以及Reader或Writer引起的內存泄漏

 

比如,把文件讀取到流中:

 

public static string ReadFile()
{
    var filePath = @"硬盤地址";
    var sr = new StreamReader(filePath);
    return sr.ReadToEnd();
}

 

以上,StreamReader在讀取數據后沒有解釋銷毀,存在"內存泄漏"。正確的做法是在使用完后及時關閉。

 

public static string ReadFile()
{
    var filePath = @"硬盤地址";
    using(var sr = new StreamReader(filePath))
    {
        return sr.ReadToEnd();
    }
}

 

或者

 

public static string ReadFile()
{
    var filePath = @"硬盤地址";
    var sr = new StreamReader(filePath);
    var result = sr.ReadToEnd();
    sr.Close();
    return result;
}

 

以上,需要我們注意的是:當通過某種流的構造函數創建的對象實例,注意及時關閉。

 

有時候,通過某個方法返回某種流的對象實例,也會忘記關閉。比如以下:

 

//創建字節數組
var data = new byte[1024];
var client = new TcpClient();
//從TCP實例方法返回流
var stream = client.GetStream();
//把流讀到字節數組中
int bytesLength = stream.Read(data, 0, data.Length);
//字節數組轉換城字符串
var result = System.Text.Encoding.ASCII.GetString(data, 0, bytesLength);

 

正確的寫法應該是:

 

//創建字節數組
var data = new byte[1024];
var client = new TcpClient();
//從TCP實例方法返回流
var stream = client.GetStream();
//把流讀到字節數組中
int bytesLength = stream.Read(data, 0, data.Length);
stream.Close();
//字節數組轉換城字符串
var result = System.Text.Encoding.ASCII.GetString(data, 0, bytesLength);

 

同理,其它與流有關的類,我們也需要注意在用完后及時關閉:

 

● FileStream
● MemoryStream
● StreamReader
● TextWriter
......

 

靜態引用引起的內存泄漏

 

對于靜態實例來說,除非應用程序關閉,對應的內存一直得不到釋放。比如有如下遵循"Siingleton"模式的類(沒考慮線程安全)。

 

public class MySingletonClass
{
    PRivate static MySingletonClass myInstance;
    private static List<IAmBig> bigObjects = new List<IAmBig>();
    private MySingletonClass(){}
    public static MySingletonClass MyInstance
    {
        get
        {
            if(myInstance == null)
            {
                myInstance = new MySingletonClass();
            }
            return myInstance;
        }
    }
    public static IAmBig CreateBigObject()
    {
        var bigObject = new IAmBig();
        bigobject.AllocateMemory(4096);
        bigObjects.add(bigObject);
        return bigObject;
    }
}
public class IAmBig
{
    
}

 

以上,每次調用CreateBigObject靜態方法,都往List<IAmBig>類型集合中添加,由于MySingletonClass靜態類實例一直存在于應用程序的生命周期,再加上GC不會釋放bigObjects這個集合對象實例,于是就出現了"內存泄漏"。解決辦法是避免讓靜態實例引用其它實例對象,避免出現靜態實例的鏈式引用。

 

委托引起的內存泄漏

 

比如有2個委托形成的委托鏈。

 

var objectOne = new ObjectOne();
var objectTwo = new ObjectTwo();
objectOne.StateChanged += objectTwo.StateChangedEventHandler;
objectTwo.Dispose();

 

以上,把objectTwo的委托注冊給了objectOne,這樣objectOne和objectTwo有依賴關系,形成了依賴鏈。只有當objectOne被釋放,才能釋放objectTwo。如果objectOne恰巧是全局靜態實例,那在應用程序的生命周期內,objectTwo一直得不到內存釋放,造成了"內存泄漏"。

 

解決辦法是在調用objectTwo的Dispose方法之前,先解開兩者的依賴關系。修改如下:

 

var objectOne = new ObjectOne();
var objectTwo = new ObjectTwo();
objectOne.StateChanged += objectTwo.StateChangedEventHandler;
......
objectOne.StateChanged -= objectTwo.StateChangedEventHandler;
objectTwo.Dispose();

 

非托管資源引起的內存泄漏

 

public class MyUnManagedExample
{
    public void Allocate()
    {
        IntPtr pointer = Marshal.AllocHGlobal(1024);
    }
}

 

對于創建的非托管類型的實例ponter,需要顯式釋放。

 

Marshal.FreeGlobal(pointer);

 

實現IDisposable接口的類引起的內存泄漏

 

所有實現IDisposable接口的類都有一個Dispose方法,如果忘記調用,就造成"內存泄漏"。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情视频在线| 97成人精品区在线播放| 国产午夜精品全部视频在线播放| 最近2019好看的中文字幕免费| 欧美另类交人妖| 亚洲欧美中文日韩v在线观看| 欧美香蕉大胸在线视频观看| 国产在线视频欧美| 中文字幕av一区中文字幕天堂| 国产精品99久久久久久久久久久久| 欧美久久久精品| 日韩中文娱乐网| 国产精品国产三级国产aⅴ9色| 亚洲精品永久免费| 91亚洲精品一区| 国产精品观看在线亚洲人成网| 日韩欧美在线免费观看| 亚洲欧洲国产一区| 欧美性xxxxhd| 4438全国成人免费| 亚洲综合自拍一区| 91热精品视频| 久久精品中文字幕一区| 午夜欧美大片免费观看| 久久精品视频中文字幕| 中文字幕亚洲一区二区三区| 一本一本久久a久久精品牛牛影视| 91av在线免费观看| 久久人人97超碰精品888| www.日韩视频| 亚洲男人7777| 欧美性猛交xxxx| 久久影院模特热| 97视频在线播放| 亚洲精品wwwww| 日韩一区二区三区国产| 日韩精品在线免费观看| 国产精品人人做人人爽| 国产日韩欧美在线看| 精品久久久久人成| 久热精品视频在线免费观看| 日韩有码在线播放| 久久久精品999| 国产精品一香蕉国产线看观看| 久久精品成人一区二区三区| 久久99精品久久久久久噜噜| 欧美精品精品精品精品免费| 永久555www成人免费| 欧美激情按摩在线| 精品毛片三在线观看| 亚洲精品在线看| 精品高清美女精品国产区| 欧美黄色片视频| 88国产精品欧美一区二区三区| 欧美孕妇毛茸茸xxxx| 国模视频一区二区| 亚洲一区亚洲二区亚洲三区| 色综合天天狠天天透天天伊人| …久久精品99久久香蕉国产| 午夜精品蜜臀一区二区三区免费| 69久久夜色精品国产7777| 国产+成+人+亚洲欧洲| 国产一区二区黄| 国产视频999| 136fldh精品导航福利| 亚洲欧美成人一区二区在线电影| 欧美巨大黑人极品精男| 国产精品精品一区二区三区午夜版| 欧美精品18videosex性欧美| 日本精品视频在线播放| 亚洲美女在线观看| 国产精品免费久久久久影院| 欧美大胆a视频| 一区二区三区四区精品| 国产91成人video| 国产精品视频不卡| 久久精品国产清自在天天线| 国产一区二区日韩精品欧美精品| 亚洲成人久久久| 久久午夜a级毛片| 韩曰欧美视频免费观看| 亚洲天堂免费在线| 日韩av免费在线播放| 国产97在线播放| 欧美成人精品影院| 性欧美亚洲xxxx乳在线观看| 超碰精品一区二区三区乱码| 久热精品视频在线观看一区| 欧美日韩亚洲精品一区二区三区| 欧美日韩国产黄| 久久久久国色av免费观看性色| 国产精品劲爆视频| 91国自产精品中文字幕亚洲| 欧美最猛性xxxx| 日韩精品高清在线观看| 韩国19禁主播vip福利视频| 国产亚洲欧美另类中文| 亚洲色图综合网| 亚洲新声在线观看| 国产精品久久77777| 九九热精品视频国产| 久久久久久噜噜噜久久久精品| 久久精品99久久久久久久久| 97超级碰碰人国产在线观看| 国产一区二区三区高清在线观看| 日韩美女免费观看| 一本大道亚洲视频| 91精品久久久久久久久久入口| 日韩成人性视频| 精品中文字幕在线2019| 国产精品精品久久久| 亚洲第一视频网站| 国产精品亚洲视频在线观看| 国产精品视频区1| 中文字幕久热精品视频在线| 91九色国产视频| 日韩精品高清在线观看| 亚洲a一级视频| 欧美日韩性视频| 欧美专区在线观看| 色综合导航网站| 亚洲性日韩精品一区二区| 欧美激情一区二区三区在线视频观看| 视频在线观看一区二区| 日韩女优在线播放| 岛国视频午夜一区免费在线观看| 97人人模人人爽人人喊中文字| 亚洲性av在线| 久久69精品久久久久久久电影好| 国产精品久久久久久久9999| 97视频在线观看亚洲| 这里只有精品久久| 久久国产精品偷| 国产精品久久久久久网站| 国产精品h片在线播放| 欧美极品美女视频网站在线观看免费| 日韩电影大全免费观看2023年上| 欧美中文字幕视频| 日韩中文字幕在线精品| 色婷婷综合成人av| 亚洲aⅴ日韩av电影在线观看| 精品久久久久久亚洲国产300| 欧美激情一区二区三区高清视频| 久久久精品视频在线观看| 日韩中文字在线| 亚洲国产又黄又爽女人高潮的| 91在线无精精品一区二区| 亚洲欧美另类中文字幕| 日本成人精品在线| www国产亚洲精品久久网站| 久久久精品电影| 久久久这里只有精品视频| 久久视频在线看| 精品国产一区二区三区久久久| 国产精品第一区| 日韩av在线播放资源| 日韩a**中文字幕| 久久久久亚洲精品| 日韩中文字幕视频在线观看| 国产精品电影网| 岛国精品视频在线播放| 国产精品爽黄69天堂a| 68精品久久久久久欧美| 精品视频—区二区三区免费|