2011-10-26 24 views
0

我已經和asp.net mvc 3網站。在本地VS web服務器或IIS上運行時,它可以。但是,在IIS(IIS 7.5 Windows 2008 R2)上運行它時,隨着內存使用量不斷增加,看起來內存泄漏。有任何想法嗎?IIS和IIS快速內存泄露

還有一個更新:可以去看在應用這樣的代碼:

SqlConnection conn = new SqlConnection { //creating connection here }; 
conn.Open(); 
SqlCommand command = conn.CreateCommand(); 

try 
{ 
    var reader = command.ExecuteReader(); 
    while (reader.Read()) 
    { 
     //read the data 
    } 
} 
finally 
{ 
    conn.Close(); 
} 

也許應該有類似reader.Dispose?它可能是內存泄漏的原因嗎?


更新:由於某種原因,gc.Collect修復了這個問題。但它不是出路,因爲一路調用gc.collect是一個壞主意。

+2

你的個人資料申請?我必須說,根據您提供的關於您的應用程序的信息,我們可以幫助您找到問題的最好方法是祝您好運。但是當你問這個問題時,我想這不是你所期望的。所以當你觀察那些內存峯值時,你將不得不提供更多關於你的應用程序的信息,此時應用程序正在做什麼,......? –

+0

你說得對,達林。我不知道我應該提供什麼。看起來如果我知道它在哪裏 - 我會修復它。我不明白如何在.net上發生內存泄漏。我們只使用DB的實體框架,作爲DI的ninject以及其他東西。 –

回答

3

這裏的最佳做法是使用括號,這是c#的一大特性。當您在括號中使用「使用」關鍵字時,它會在使用括號作用域時自動處理使用的對象。這裏是一個例子;

// SqlConnection implements IDisposable, will be disposed after bracket is closed 
using(SqlConnection conn = new SqlConnection()) 
{ 
     conn.Open(); 
     // SqlCommand implements IDisposable, will be disposed after bracket is closed 
     using(SqlCommand command = conn.CreateCommand()) 
     { 
     // DataReader implements IDisposable, will be disposed after bracket is closed 
     using(var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       // read here. 
      } 
     } 
     } 
} 

這裏還有一個微軟鏈接,上面寫着「連接在使用塊結束時自動關閉」。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close%28v=VS.85%29.aspx

我希望它有幫助。

+0

所有(3)組件都應該被丟棄(它們都支持'IDisposable'),它會自動爲你調用'Close()'(在'SqlConnection'和'SqlDataReader'的情況下) – SliverNinja

+0

感謝你的回答,detay。其實已經做了改變。現在將部署並讓你知道這是否是問題。 –

+0

仍在等待部署:-(。將盡快更新: –