c# memory memory-leaks uwp

c# - UWP: la navegación de cuadros parece causar fugas de memoria no administradas



memory memory-leaks (1)

Parece que la navegación de cuadros (específicamente el método Frame.Navigate (Type) ) está filtrando la memoria no administrada.
Después de cada navegación cuando miro las Herramientas de diagnóstico de Visual Studio , Bytes privados está subiendo pero cuando tomo una instantánea de la memoria, el Tamaño de Heap no aumenta. Cuantos más componentes tenga la página, peor será. La memoria no parece ser lanzada alguna vez. No importa si la aplicación está integrada en Debug o Release (ambas con .Net Native y sin). Estoy usando el SDK 14393 (actualización de aniversario).

Creé una aplicación de muestra que tiene una página maestra y 2 páginas (de contenido) que sigue navegando en el medio (en el evento PageLoaded). He configurado CacheSize = "0" en el Frame y las páginas tienen NavigationCacheMode = "Disabled" para que no se almacenen en caché. También borro el backstack antes de cada navegación y cancelo la suscripción a cada evento en PageUnloaded.
Aquí está el archivo .cs para una de las páginas:

public sealed partial class FirstPage : Page { public FirstPage() { this.InitializeComponent(); } private void NavigateToSecondPage() { MainPage.ContentFrame.BackStack.Clear(); MainPage.ContentFrame.Navigate(typeof(SecondPage)); } private void NavigateButton_Click(object sender, RoutedEventArgs e) { NavigateToSecondPage(); } private void Page_Loaded(object sender, RoutedEventArgs e) { if (!MainPage.StopNavigating) { NavigateToSecondPage(); } } private void Page_Unloaded(object sender, RoutedEventArgs e) { this.NavigateButton.Click -= NavigateButton_Click; this.Loaded -= Page_Loaded; this.Unloaded -= Page_Unloaded; } }

Y el archivo XAML correspondiente:

<Page x:Class="LeakTestApp.FirstPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:LeakTestApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Loaded="Page_Loaded" Unloaded="Page_Unloaded"> <StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <TextBlock Text="First Page" FontSize="32" /> <Button x:Name="NavigateButton" Content="Navigate to Second Page" Click="NavigateButton_Click" /> <StackPanel Width="350"> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> <TextBox /> </StackPanel> </StackPanel> </Page>

Los cuadros de texto aquí están para mostrar mejor el problema.
Aquí puede ver que tan pronto como comienzo la navegación, los Bytes privados comienzan a aumentar rápidamente, pero el Tamaño del Heap no aumenta.
La habilitación de la memoria caché (NavigationCacheMode = "Requerido") o la invocación manual de GC.Collect () no ayuda.
Puede ver el código fuente completo aquí .

¿Hay algo obvio que me estoy perdiendo? ¿No estoy despejando todo correctamente? ¿O quizás el tiempo de ejecución liberará la memoria finalmente?

Gracias

Actualización: busque en los comentarios un video que muestre el comportamiento (no tengo suficiente reputación para publicar más de 2 enlaces)


No puedo reproducir su problema ya que el resultado del monitor de su proyecto es el siguiente en mi lado. No vi la colección de gabbge en tu foto. Pero por mi parte, el GC ha funcionado con frecuencia. Preste atención a que GC no se encuentra en tiempo real. Puede intentar usar GC.Collect Method () para recopilar datos por su cuenta, pero no se recomienda su uso en un producto. Detalles puede hacer referencia a este hilo .