возможная утечка памяти? - PullRequest
       19

возможная утечка памяти?

1 голос
/ 02 сентября 2010

Я профилирую код ниже в синглтоне и обнаружил, что многие объекты Rate сохраняются в памяти, хотя я их очищаю.

protected void FetchingRates()
{
  int count = 0;

  while (true)
  {
    try
    {
      if (m_RatesQueue.Count > 0)
      {
        List<RateLog> temp = null;

        lock (m_RatesQueue)
        {
          temp = new List<RateLog>();
          temp.AddRange(m_RatesQueue);
          m_RatesQueue.Clear();
        }

        foreach (RateLog item in temp)
        {
          m_ConnectionDataAccess.InsertRateLog(item);
        }

        temp.Clear();
        temp = null;
      }
      count++;
      Thread.Sleep(int.Parse(ConfigurationManager.AppSettings["RatesIntreval"].ToString()));
    }
    catch (Exception ex)
    {                   
    }
  }
} 

вставка в очередь производится:

public void InsertLogRecord(RateLog msg)
{
  try
  {
    if (m_RatesQueue != null)
    {
      //lock (((ICollection)m_queue).SyncRoot)
      lock (m_RatesQueue)
      {
        //insert new job to the line and release the thread to continue working.
        m_RatesQueue.Add(msg);
      }
    }
  }
  catch (Exception ex)
  {
  }
}

работник вставляет журнал ставок в БД следующим образом:

 internal int InsertRateLog(RateLog item)
    {
        try
        {
            SqlCommand dbc = GetStoredProcCommand("InsertRateMonitoring");
            if (dbc == null)
                return 0;
            dbc.Parameters.Add(new SqlParameter("@HostName", item.HostName));
            dbc.Parameters.Add(new SqlParameter("@RateType", item.RateType));
            dbc.Parameters.Add(new SqlParameter("@LastUpdated", item.LastUpdated));
            return ExecuteNonQuery(dbc);
        }
        catch (Exception ex)
        {
            return 0;
        }
    }

кто-нибудь видит возможную утечку памяти?

Ответы [ 4 ]

3 голосов
/ 02 сентября 2010

Я бы посоветовал остановить проглатывание всех исключений.

2 голосов
/ 02 сентября 2010

Вы, безусловно, очищаете очередь и временный список temp (в этом нет необходимости, поскольку он подходит для сбора даже перед тем, как назначить null для ссылки ). На данный момент я думаю, что ваша проблема, скорее всего, связана со следующей строкой.

m_ConnectionDataAccess.InsertRateLog(item);

Вы передаете ссылку на RateLog другому методу. Вы не предоставили никаких сведений об этом методе, поэтому я не могу исключить возможность того, что он хранит свою собственную копию ссылки в отдельной структуре данных.

1 голос
/ 04 сентября 2010

У меня возникла та же проблема.Вероятно, этому есть реальное объяснение, но я не смог его найти.

Я предположил, что, поскольку я был в цикле while(true), сборщик мусора не будет работать.Я не знаю, является ли это артефактом реализации MS .NET Framework (.NET 3.5), но это то, что я испытал.

Я уменьшил кучу памяти, положив GC.Collect(); в нижней части цикла.

У меня такое ощущение, что это было что-то связанное с нерасположенными SqlConnection объектами.

1 голос
/ 02 сентября 2010

Нет необходимости в очистке и обнулении List<RateLog> temp. Он все равно будет собран GC, потому что выход из области действия функции с отсутствием ссылок, то есть больше нет ссылок на эту переменную в конце функции, поэтому она будет собрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...