2015-07-02 135 views
-2

我有一個ASP.Net中的「內存泄漏」問題。 我創建了一個與數據庫連接的空白頁面。 內存在頁面訪問時增加,並且不會立即恢復正常!最高峯值內存在1GB!之間,那麼我必須回收IIS中的「池」...我使用Connection.Close()和connection.Dispose()方法,但似乎它們工作正常。 我在網上搜索了更多的靈魂無法找到。ASP.Net應用程序池內存泄漏

有什麼辦法可以解決這個問題,而不必回收池? 感謝分享知識!

這是在其中發生內存泄漏的塊:

SqlConnection cn = new SqlConnection(""); 
    SqlCommand cm = new SqlCommand(); 

    SqlDataReader dr = null; 

    try 
    { 
     cn.Open(); 
     cm.Connection = cn; 
     cm.CommandTimeout = 600; 
     cm.CommandText = ""; 

     cm.Parameters.Add("operation", SqlDbType.Int).Value = 1; 
     cm.Parameters.Add("now", SqlDbType.DateTime).Value = DateTime.Now; 

     dr = cm.ExecuteReader(CommandBehavior.SingleResult); 
     while (dr.Read()) 
     { 
      //blah blah blah... 
     } 
     dr.Close(); 
    } 
    catch (Exception ex) 
    { 

    } 
    finally 
    { 
     if (dr != null) 
      dr.Dispose(); 

     cm.Dispose(); 

     cn.Close(); 
     cn.Dispose(); 
    } 
+2

這將是一個更容易使用,如果你在'using'陳述包裹你的CN /平方釐米/ DR,它所有的花哨的東西像關閉/對你例外後處置。另外,如果你告訴它返回單個結果,爲什麼還要使用'while'循環呢?將'while'改爲'if'...並不是說這些都是你的問題,但它會清理你的代碼。 –

+0

我的猜測是你的等等,等等等等等等等等等等等等等等等等等等等等等等等等等。留下所有的對象打開和垃圾收集 – Ewan

+0

首先研究.NET內存模型,你不會感到如此驚訝。 –

回答

0

您設置所有的一次性對象,這是很好。在這種情況下最好使用'using'而不是最後。查看您提供的代碼無法看到內存泄漏的任何原因。

using (SqlConnection cn = new SqlConnection("")) 
using (SqlCommand cm = new SqlCommand()) 
{ 
    ..... 

    using (var dr = cm.ExecuteReader(CommandBehavior.SingleResult)) 
    { 
     while (dr.Read()) 
     { 
      //blah blah blah... 
     } 
    } 
} 

請記住,之後任何實例處置垃圾收集不釋放內存 。

它已經過優化,只有在有內存壓力時才觸發和釋放內存。所以,如果你想測試內存泄漏,你應該在獲取內存使用量讀數之前手動執行垃圾回收。

GC.Collect(); 
GC.WaitForPendingFinalizers();