Да, согласно тому, что вы указали, у вас есть утечка памяти. Когда вы нашли цепочку ссылок, а ее нет в вашем коде, проще всего было бы ... Отражатель.
Изображение говорит: JournalEntryKeepAlive._keepAliveRoot
поле содержит ссылку на объект. Пойдемте в Reflector и посмотрим, как этот парень подсел на наш объект.
На этот раз это было легко, и все следы приводят к функции NavigationService.MakeJournalEntry()
, а затем к NavigationService.IsContentKeepAlive()
. Вот оно:
internal bool IsContentKeepAlive()
{
bool keepAlive = true;
DependencyObject dependencyObject = this._bp as DependencyObject;
if (dependencyObject != null)
{
keepAlive = JournalEntry.GetKeepAlive(dependencyObject);
if (!keepAlive)
{
PageFunctionBase base2 = dependencyObject as PageFunctionBase;
bool flag2 = !this.CanReloadFromUri;
if ((base2 == null) && flag2)
{
keepAlive = true;
}
}
}
return keepAlive;
}
Теперь вы знаете правила. Объект сохраняется в памяти, если:
- Это не объект зависимости;
- Прилагается свойство JournalEntry.KeepAlive имеет значение true;
- Это не функция PageFunction, и ее нельзя перезагрузить из Uri.
После этого исследования, возможно, стоит прочитать больше о свойстве JournalEntry.KeepAlive в MSDN.
Эта стратегия помогла мне найти много связанных с памятью насекомых. Надеюсь, это вам тоже поможет:).
PS: Если у вас возникнут проблемы с обнаружением этой конкретной утечки, вы можете вставить минимальный образец кода, чтобы мы могли воспроизвести его и дать вам более правильный ответ.
Ура,
Anvaka