UWP - 帧导航似乎导致非托管内存泄漏

Roo*_*ozi 7 c# memory memory-leaks uwp

看来Frame导航(特别是Frame.Navigate(Type)方法)正在泄漏非托管内存.
在我查看Visual Studio诊断工具的每次导航之后,Private Bytes正在上升,但是当我拍摄内存的快照时,堆大小没有增加.页面越多,组件越糟糕.内存似乎永远不会被释放.无论应用程序是构建在Debug还是Release(无论是.Net Native还是没有),都无关紧要.我正在使用14393 SDK(周年纪念更新).

我创建了一个示例应用程序,它具有一个主页面和两个(内容)页面,它们之间保持导航(在PageLoaded事件上).我已将CacheSize ="0"设置为Frame,并且Pages具有NavigationCacheMode ="Disabled",因此它们不会被缓存.我也在每次导航之前清除了backstack并取消订阅PageUnloaded上的每个事件.
以下是其中一个页面的.cs文件:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

和相应的XAML文件:

<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>
Run Code Online (Sandbox Code Playgroud)

这里的文本框是为了更好地显示问题.
你可以在这里看到,一旦我开始导航私有字节开始快速增加,但堆大小不会增加.
启用缓存(NavigationCacheMode ="必需")或手动调用GC.Collect()没有帮助.
你可以在这里查看完整的源代码.

有什么明显的东西我不见了吗?我没有正确清理一切吗?或者运行时最终会释放内存?

谢谢

更新:在评论中查看显示行为的视频(我没有足够的声誉发布超过2个链接)

Roo*_*ozi 1

我已向 Microsoft 报告了此问题,实际上存在一个小的内存泄漏,现在应该修复。
然而,我看到这种严重泄漏的原因是Visual Studio 诊断工具显示了错误的值。当我使用Visual Studio Performance Profiler时,泄漏要小得多。