pattern page navigate detail c# memory win-universal-app windows-10 uwp

c# - page - Aumento de la memoria de la aplicación UWP Windows 10 en la navegación



uwp navigate to page (3)

Tengo una aplicación UWP para Windows 10 y noté que el uso de memoria en el administrador de tareas aumenta con el tiempo.

Retiré la aplicación y descubrí que la memoria aumenta cuando las páginas navegan. Así que hice una aplicación simple con solo unas pocas páginas para probar y la memoria aún está aumentando en esta sencilla aplicación. Tengo una página principal que navega un fotograma de la página 1 a la página 2 y viceversa.

public sealed partial class MainPage : Page { private DispatcherTimer _timer; private bool _page1Showing; private bool _timerRunning; public MainPage() { this.InitializeComponent(); _timer = new DispatcherTimer(); _timer.Interval = new TimeSpan(0, 0, 0, 0, 200); _timer.Tick += _timer_Tick; } private void _timer_Tick(object sender, object e) { GC.Collect(); this.rootFrame.BackStack.Clear(); this.rootFrame.ForwardStack.Clear(); if (_page1Showing) { this.rootFrame.Navigate(typeof(Page2)); _page1Showing = false; } else { this.rootFrame.Navigate(typeof(Page1)); _page1Showing = true; } } private void Button_Click(object sender, RoutedEventArgs e) { if (_timerRunning) { _timer.Stop(); _timerRunning = false; } else { _timer.Start(); _timerRunning = true; } } }

Página1 y Página2 son páginas vacías con una cuadrícula con un color de fondo para que pueda ver la navegación. Mientras que esta aplicación ejecuta el uso de la memoria en el administrador de tareas aumenta en alrededor de 1 MB cada 30 minutos.

He ejecutado la aplicación utilizando los diagnósticos de memoria en VS2015, el heap administrado es el esperado:

El montón siempre está aumentando:

La comparación de instantáneas del Heap muestra:

Estoy confundido acerca de qué son estos objetos McgInterop? y por qué una aplicación tan simple siempre aumenta en uso de memoria. Mi aplicación principal debe ejecutarse durante mucho tiempo (meses +). Aprecia cualquier ayuda.

He intentado cambiar las páginas NavigationCacheMode, si se establece en Requerido, las páginas se crean una vez. Si se configura como deshabilitado, las páginas se crean todas las veces, y verifiqué que el finalizador se haya llamado como se esperaba.

-

Editar : agregué un botón para iniciar y detener el temporizador (actualizado arriba). Parece que mientras el temporizador se está ejecutando el uso de la memoria en el Administrador de tareas aumentará, cuando se detiene el temporizador, el uso de la memoria finalmente disminuye.

Medí el uso de la memoria en el administrador de tareas durante un día, comenzando y deteniendo el temporizador cada 2 horas de la siguiente manera, lentamente aumenta y luego cae en algún punto:

12.5 -> 17.1 -> 16.7 -> 13.9 -> 16.8 -> 22.5 -> 13.6 -> 14.6 -> 24.9 -> 15.2

¿Entonces creo que todo está funcionando bien? Pero no estoy seguro de lo que está sucediendo aquí, ¿por qué está aumentando tanto? ¿Cuándo se está liberando bajo qué condiciones?

¿El sistema está retrasando la liberación de memoria mientras las páginas están navegando? cuando el usuario normalmente estaría interactuando con la pantalla?



Cada vez que navega hacia una página, crea una nueva instancia de página, pero la página anterior no se elimina (incluso si la página ya está en la pila de navegación).

Para evitar la asignación múltiple de la misma página, configure el atributo NavigationCacheMode="Enabled" en la página.

Además, para minimizar la asignación de memoria, debe anular el método OnNavigatedTo y OnNavigatedFrom .

En el método OnNavigatedTo :

  • Crear una instancia de todos los objetos o recursos intensivos en memoria
  • Agrega todos los controladores de eventos que necesites
  • inicia todos los temporizadores, tareas o hilos

En OnNavigatedFrom :

  • Eliminar todos los recursos
  • Detiene todos los temporizadores, tareas o hilos
  • Eliminar referencias de todos los objetos pesados
  • Eliminar todos los controladores de eventos
  • Solo si realmente lo necesita, llame a GC.Collect ()

He visto el mismo problema en w8.1 con la impresión en línea usando charmBar está consumiendo mucha memoria hasta que falla la aplicación (1.5 GB). pero normalmente no necesita GC.colect () es un trabajo automático.