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个链接)
我已向 Microsoft 报告了此问题,实际上存在一个小的内存泄漏,现在应该修复。
然而,我看到这种严重泄漏的原因是Visual Studio 诊断工具显示了错误的值。当我使用Visual Studio Performance Profiler时,泄漏要小得多。
| 归档时间: |
|
| 查看次数: |
1007 次 |
| 最近记录: |