Sí, según lo que ha proporcionado, tiene una pérdida de memoria. Cuando encuentre la cadena de referencias, y no esté en su código, la manera más fácil de hacerlo sería ... Reflector.
La imagen dice: JournalEntryKeepAlive._keepAliveRoot
campo contiene una referencia al objeto. Vamos en Reflector y veamos cómo este tipo está enganchado con nuestro objeto.
Esta vez fue fácil, y todos los rastros conducen a la función NavigationService.MakeJournalEntry()
y luego a NavigationService.IsContentKeepAlive()
. Aquí está:
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;
}
Ya conoce las reglas. El objeto se mantiene en la memoria si:
- No es un objeto de dependencia;
- Propiedad adjunta JournalEntry.KeepAlive es verdadera;
- No es una función de página y no se puede volver a cargar desde Uri.
Después de esta investigación, puede valer la pena leer más acerca de la propiedad JournalEntry.KeepAlive en MSDN.
Esta estrategia me ayudó a encontrar muchos insectos relacionados con la memoria. Espero que te ayude también :).
PD: Si sigue teniendo problemas para encontrar esta fuga en particular, puede pegar una muestra mínima de código para que la reproduzcamos y le proporcionemos una respuesta más adecuada.
Saludos, Anvaka
Gracias por la explicación detallada, pero no estoy seguro de seguir la parte DependencyProperty. Si configuré KeepAlive como falso en todas las páginas, ¿por qué se mantendría en la memoria? – Brandon
Siga la ruta lógica: incluso si establece KeepAlive = false en cada página, aún puede ser verdadero desde IsContentKeepAlive() cuando flag2 es verdadero, que dice:! CanReloadFromUri – Anvaka
Ah, a la derecha. Gracias por la gran respuesta. – Brandon