2010-11-01 3 views
2

У меня есть приложение asp.net, оно работает на DotNetNuke, при загрузке мы получаем случайное исключение из памяти.Получение исключения из памяти с помощью System.Threading.ReaderWriterCount

У меня дамп загружен в windbg.

конец! Dumpheap -stat является

1192a588 88684  2128416 AutoMapper.MappingEngine 
79333594  9482  2266348 System.Byte[] 
134b0034 88695  2838240 System.EventHandler`1[[AutoMapper.TypeMapCreatedEventArgs, AutoMapper]] 
13d8703c 88684  4611568 System.Collections.Generic.Dictionary`2[[Castle.DynamicProxy.Generators.CacheKey, AutoMapper],[System.Type, mscorlib]] 
13d86dc8 88684  4611568 Castle.DynamicProxy.ModuleScope 
13d865bc 88684  4611568 System.Collections.Generic.Dictionary`2[[AutoMapper.Internal.TypePair, AutoMapper],[AutoMapper.IObjectMapper, AutoMapper]] 
79327434 88703  4612556 System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.Int32, mscorlib]] 
6c38e4e4 88684  5675776 System.Threading.ReaderWriterLockSlim 
79330b24 87736  6458012 System.String 
000d9c88  129  24186884  Free 
793042f4 221202 101117016 System.Object[] 
6c38e4a0 22703104 544874496 System.Threading.ReaderWriterCount 

Я не могу найти много информации о System.Threading.ReaderWriterCount, как представляется, проблема.

Какова вероятная причина? Или, если это не лучший способ сделать это?

Основываясь на указателе с данного ответа, я посмотрел на ReaderWriterLockSlim. Я не использовал его напрямую, но я видел, что у него было 88684 экземпляра, и я рылся глубже, я видел немало классов с таким количеством экземпляров, указывая на AutoMapper.MappingEngine. Это должен быть синглтон, поэтому я посмотрел, где он создается. Я подозреваю, что это контейнер DI и внесли некоторые изменения вокруг этого, чтобы узнать, помогает ли это

+0

У меня было несколько классов, вызывающих эту проблему. Они создавали дополнительные экземпляры механизма сопоставления, были другие классы, которые поддерживались, когда их не должно было быть. Я закончил развязку дочернего класса с сервисом (он поддерживал ссылку), и тогда служба могла быть собрана мусором, и память была освобождена. – baralong

ответ

2

ReaderWriterLockSlim - не дешевый класс в области памяти - это может быть причиной того, что ваши ReaderWriterCount экземпляров разрастаются. Для получения подробной информации от Reflector см. here.

Можете ли вы уменьшить использование этого класса? Может быть, не все они должны быть Read/Write Locks, просто Mutex/lock() может работать?

Отметьте также, что этот класс IDisposable - возможно, вы не Dispose() -после их после вас с ними?

+0

Спасибо, хотя странно, что я не использую ReaderWriterLockSlim, по крайней мере, ни в одном из моих кодов. Я использую linq для sql и Oracle.DataAccess. Любые идеи относительно того, что может использовать это, или как я могу это выяснить? – baralong

+0

@baralong - вам нужно что-то вроде отслеживания объекта .Net в Visual Studio 2010 (также более ранние версии): http://msdn.microsoft.com/en-us/library/dd264934.aspx –

Смежные вопросы