西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁編程開發(fā)C#.NET → .Net 內(nèi)存溢出常見情況和處理方式總結(jié)

.Net 內(nèi)存溢出常見情況和處理方式總結(jié)

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:內(nèi)存溢出時間:2013/1/16 13:47:36字體大。A-A+

作者:玉開點(diǎn)擊:0次評論:4次標(biāo)簽: 內(nèi)存溢出

.NETv3.0 可再發(fā)行組件包
  • 類型:編程輔助大。2.7M語言:中文 評分:1.8
  • 標(biāo)簽:
立即下載

在什么情況下會出現(xiàn)OutOfMemonryException呢? 在我們試圖新建一個對象時,而垃圾收集器又找不到任何可用內(nèi)存時被拋出,這種情況下我們是可以捕獲該異常的; 另一種情況是,CLR需要內(nèi)存時,而卻系統(tǒng)卻不能提供,也會拋出該異常. 但此時,我們的應(yīng)用程序是不能捕獲該錯誤的.

內(nèi)存溢出(OutOfMemoryException)的調(diào)試分析

32位操作系統(tǒng)的尋址空間是4G,其中有2G被操作系統(tǒng)占用,也就是說留給用戶進(jìn)程的內(nèi)存只有2G(其中還要扣除程序加載時映像占用的部分空間,一般只有1.6G~1.8G左右可以使用)。 如果進(jìn)程運(yùn)行中需要申請內(nèi)存,而操作系統(tǒng)無法為其分配內(nèi)存空間,則會產(chǎn)生內(nèi)存不足的異常,在.net中為System.OutOfMemoryException(The exception that is thrown when there is not enough memory tocontinue the execution of a program.)。 雖然最終的表現(xiàn)都為OutOfMemoryException,但其產(chǎn)生的原因可能是不一樣的,動手解決此問題之前需要先對進(jìn)程當(dāng)前內(nèi)存的使用狀態(tài)進(jìn)行分析,找出正確的原因,才能對癥下藥。下面分享一下調(diào)試此類問題的一些心得。

iis應(yīng)用程序池 內(nèi)存溢出錯誤 System.OutOfMemoryException

在ASP.NET web服務(wù)器上,ASP.NET所能夠用到的內(nèi)存,通常不會等同于所有的內(nèi)存數(shù)量。在machine.config配置文件中,配置節(jié)<processModel>中有一個屬性“memoryLimit”,這個屬性的值是一個百分值,默認(rèn)為“60”,即指定了ASP.NET進(jìn)程(在任務(wù)管理器中大家就可以看到ASP.NET的進(jìn)程,IIS5中為aspnet_wp,IIS6中為w3wp)能夠使用所有物理內(nèi)存的60%。當(dāng)ASP.NET使用的內(nèi)存量超過這個限額時,IIS會開始自動回收(recycle)進(jìn)程,即創(chuàng)建一個新的進(jìn)程去負(fù)責(zé)應(yīng)付Http請求,而將舊進(jìn)程所占用的內(nèi)存回收。

當(dāng)我們有一臺很大內(nèi)存的服務(wù)器時,“memoryLimit”這個值是需要進(jìn)行適當(dāng)?shù)恼{(diào)整的。比如我們準(zhǔn)備了一臺chemas-microsoft-com ffice marttags" />t="on">4G內(nèi)存的服務(wù)器,那么t="on">4G×60%=t="on">2.4G。但是,對于Win32操作系統(tǒng),一個進(jìn)程所能占用的所有內(nèi)存空間只有t="on">2G。當(dāng)ASP.NET進(jìn)程占用的內(nèi)存開始達(dá)到t="on">2G時,由于它并沒有達(dá)到t="on">2.4G的“回收閾值”,所以IIS不會啟動recycle進(jìn)程操作,但是由于Win32的限制,實際上已經(jīng)不能給這個進(jìn)程分配更多的內(nèi)存了,于是,OutOfMemoryException就很可能會被拋出了。為了避免這樣的情況,我們就必須將“memoryLimit”適當(dāng)調(diào)小,以讓IIS更早的進(jìn)行進(jìn)程回收。

微軟推薦的ASP.NET進(jìn)程占用內(nèi)存是不超過60%,并最好使計算出的實際值不超過t="on">800M。就是說,對于一臺t="on">4G內(nèi)存的服務(wù)器,最好將“memoryLimit”屬性設(shè)置成“20”。設(shè)置一個適當(dāng)?shù)幕厥臻撝,讓IIS適時的進(jìn)行進(jìn)程回收,對于保證整個服務(wù)器的穩(wěn)定運(yùn)行,避免OutOfMemoryException是非常重要的。

在IIS6中,ASP.NET進(jìn)程的回收閾值不再由配置節(jié)中的“memoryLimit”屬性決定,而是由IIS管理器中的應(yīng)用程序池配置中的設(shè)置決定。

但是,即使正確設(shè)置了這些配置,也不能保證完全避免OutOfMemoryException的發(fā)生,原因可能是多樣而復(fù)雜的,比如內(nèi)存回收操作可能耗時太多等等。開發(fā)人員要注意的,就是在代碼中時刻牢記不要無謂的使用和浪費(fèi)內(nèi)存。:)

如果你有一臺大內(nèi)存的服務(wù)器,同時對Win32操作系統(tǒng)中對于進(jìn)程最高使用t="on">2G內(nèi)存的限制很郁悶,可選的解決方法有兩個:

使用/3GB模式啟動計算機(jī),方法參加文后的鏈接

使用Windows Server 2003 64bits Edition

避免內(nèi)存溢出的幾點(diǎn)要素

如果要創(chuàng)建數(shù)組,請確保其大小正確。

確保有足夠的內(nèi)存用于內(nèi)部用途和新的托管對象。

如果您正在 .NET Compact Framework 上進(jìn)行編程,當(dāng)沒有足夠的內(nèi)存可用于內(nèi)部用途或新的托管對象時,公共語言運(yùn)行庫會引發(fā)此異常。要避免此異常,應(yīng)避免編寫占用 64KB 或更多內(nèi)存的大方法。

過多的托管內(nèi)存使用量通常由以下因素造成:

將大型數(shù)據(jù)集讀入內(nèi)存中。

創(chuàng)建過多的緩存條目。

上載或下載大文件。

在分析文件時過多地使用正則表達(dá)式或字符串。

過多的視圖狀態(tài)。

會話狀態(tài)中有過多的數(shù)據(jù)或者會話過多。

當(dāng)對 COM 對象調(diào)用一個方法,并且該方法返回包含安全數(shù)組(大小不固定的數(shù)組)的用戶定義類型時,可能引發(fā)此異常,并附帶一條額外的消息“存儲空間不足,無法完成此操作”。這是因為 .net framework 無法封送帶有安全數(shù)組類型的結(jié)構(gòu)字段。

一種不當(dāng)使用字節(jié)數(shù)組導(dǎo)致內(nèi)存溢出的情況舉例

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        byte[] bytes = File.ReadAllBytes("D:\toClient.xls");//toClient.xls 大小為20M
        Response.BinaryWrite(bytes);
    }
}

上面的程序如果所輸出的文件特別大的話,有可能會直接報:System.OutOfMemoryException。正確的做法是把文件的字節(jié)流分段輸出,其實asp.net有現(xiàn)成的方法Response.WriteFile(filePath)就是這么做的。

如下是正確的寫法:

Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(downloadName, System.Text.Encoding.UTF8));
Response.WriteFile("D:\toClient.xls");
Response.Flush();
Response.End();

當(dāng)asp.net出現(xiàn)內(nèi)存溢出時,一種簡單的處理方法是馬上回收應(yīng)用程序池。但是這樣并沒有徹底解決問題。

創(chuàng)建Image類型時出現(xiàn)內(nèi)存溢出(System.OutOfMemoryException)

錯誤代碼: System.Drawing.Image myimg=System.Drawing.Image.FromFile(file.FullName);

當(dāng)打開的文件不是圖像文件時會引發(fā)的異常:

MSDN:如果文件沒有有效的圖像格式,或者如果 GDI+ 不支持文件的像素格式,則此方法將引發(fā) OutOfMemoryException 異常。

這樣的異常信息容易讓人誤解。

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(4)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)