ServiceStack Funq Контейнер WeakReference распространение
Недавно я написал небольшой сервис, который обрабатывает большие объемы (порядка 60+ миллионов запросов в день), и у него возникают проблемы с памятью. Сначала я просмотрел всех обычных подозреваемых, убежденных, что это должно быть что-то, что я написал, а не что-то, что связано с очень полезными и ориентированными на производительность библиотеками ServiceStack. Однако, используя windbg для! Dumpheap -stat на рабочем сервере, я с удивлением обнаружил, что подавляющее большинство объектов в памяти - это типы System.WeakReference с! Gcroots, указывающими на контейнер Funq ServiceStack.
Я даже не использую структуру данных IoC в своем сервисе, поэтому мне было интересно, почему это происходит? Я что-то неправильно инициализирую? Мой класс инициализации apphost просто вызывает базовый конструктор с информацией о сборке и имени, я вообще не переопределяю метод Configure.
public SvcName() : base("SvcName", typeof(SvcName).Assembly) { }
В другом месте я читал, что объекты System.WeakReference часто вставляются.NET в редких случаях из-за того, что Visual Studio компилирует двоичные файлы с включенным параметром отладки "Редактировать и продолжить", но отключение его в моем VS не имеет никакого эффекта (предположительно потому, что двоичные файлы SS уже скомпилированы и упоминаются в моем проекте).
У кого-нибудь еще была эта проблема?
1 ответ
WeakReference используется в Funq для отслеживания IDisposable
Это хранится в стеке WeakReference одноразовых изделий, как показано здесь. В основном Funq отслеживает каждый IDisposable
WeakReference создан, чтобы их можно было утилизировать при удалении контейнера.
Я бы сначала посмотрел на то, можете ли вы сократить использование IDisposable
экземпляры (например, используя больше синглетонов), в противном случае попробуйте изменить исходный код Funq для использования Stack<IDisposable>
вместо Stack<WeakReference>
и дайте мне знать, если это решит вашу проблему, если я это сделаю, я могу включить опцию в ServiceStack для использования Stack<IDisposable>
вместо Stack<WeakReference>
,