2015-07-02 5 views
-2

У меня проблема с «утечкой памяти» в ASP.Net. Я создал пустую страницу, связанную с базой данных. Память увеличивается в момент доступа к странице и не возвращается в нормальное состояние в кратчайшие сроки! самая высокая пиковая память была между 1 Гб!, тогда мне приходится перерабатывать «пул» в IIS ... Я использую методы Connection.Close() и connection.Dispose(), но кажется, что они работают. Я искал в Интернете больше soulção не смог найти.Ошибка утечки пула приложений 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' заявления, он делает все модные вещи, как закрытие/утилизации после исключения для вас. Кроме того, почему вы используете цикл while, если вы говорите ему, чтобы он возвращал один результат? измените 'while' на' if' ... Не то, что это ваши проблемы, но он очищает ваш код. –

+0

моя догадка - это ваш бла-бла, бла, блавы вызывают исключение, а блок finally также вылетает, когда он пытается избавиться от незакрытого dr. оставив все объекты открытыми и un garbage собрал – 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(); 
Смежные вопросы