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

时间:2016-11-18 13:00:45

标签: c# memory memory-leaks uwp

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

我创建了一个示例应用程序,它具有一个主页面和两个(内容)页面,它们之间保持导航(在PageLoaded事件上)。我已将 CacheSize =“0”设置为Frame,并且页面 NavigationCacheMode =“已禁用”,因此它们不会被缓存。我还要在每次导航之前清除背斜,并取消订阅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;
    }
}

相应的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>

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

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

谢谢

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

2 个答案:

答案 0 :(得分:1)

我无法重现您的问题,因为您项目的监控结果如下。 enter image description here 我没有在你的照片中看到gabbge系列。但就我而言,它经常使用GC。请注意GC不是实时的。您可以尝试使用GC.Collect Method ()来自行收集,但不建议在产品中使用。您可以参考this thread详细信息。

答案 1 :(得分:1)

我已将此问题报告给了Microsoft,实际上现在应该解决一个小内存泄漏。
但是,我看到此大量泄漏的原因是 Visual Studio诊断工具显示错误的值。当我使用Visual Studio Performance Profiler 时,泄漏要小得多。

相关问题