Утечка памяти в EmulationTrader + LocalMarketDataDrive
Гоняю 1000 итераций, где в каждой создаю EmulationTrader и все необходимое, он отрабатывает, уничтожаю объекты. Память накапливается, и программа заканчивается с OutOfMemory Exception.
Вызываю для всех объектов где надо Dispose(), где надо null, отписываюсь от событий, но память все равно течет.
Профайлером ANTS Memory Profiler я увидел, что продолжают висеть в памяти EmulationTrader-ы и LocalMarketDateDrive-ы. На них ссылаются делегаты (видимо, их же обработчики, подписавшиеся на события извне). Вот последовательность взаимных ссылок, которые держат объекты (читать лучше снизу вверх: удерживаемый объект - внизу, корневая удерживающая ссылка - вверху):
1. Делегат LocalMarketDataDrive-а
Код
static LazyHelpers _delegates (references to ->)
Ecng.Collections.SyncrhonizedDictionary<Object, Delegate> _inner ->
Dictionary<Object, Delegate> entries ->
it's [0].Value ->
(delegate) System.Func<CachedSyncronizedOrderDictionary<DateTime, DateTime>> (inside LocalMarketDataDrive) ->
LocalMarketDataDrive
2. Делегат EmulationTrader-а
Код
static List<Ecng.ComponentModel.EventsContainer> _containers ->
it's _items[0] ->
EventsContainer<Security> _processDataError ->
(delegate) System.Action<Exception> (inside EmulationTrader) ->
EmulationTrader (internal field #=q.....GZQ==)->
LocalMarketDataDrive
Поскольку у меня нет исходников S#, то догадки свои проверить не могу. Могу прислать дампы программы для анализа. Ну, и привести кусочки кода создания/освобождения объектов.
Буду очень благодарен за исправления!
UPD. Версия последняя, 4.1.19.1