UWP утечка памяти навигации - PullRequest
0 голосов
/ 19 июня 2019

Мы заметили, что наши приложения UWP имеют утечки памяти.Я исследовал это и обнаружил, что при переходе на новые страницы память увеличивается и, кажется, не сильно уменьшается, даже когда запускается GC.

Я собрал небольшое репро, состоящее из двухстраницы:

  1. MainPage
<Page>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="70" />
            <RowDefinition  />
        </Grid.RowDefinitions>

        <Button x:Name="navigateButton" Content="Navigate" HorizontalAlignment="Center"
                    Click="NavigateButton_Click" />

        <Frame x:Name="mainFrame" IsNavigationStackEnabled="False"
               Padding="10" Grid.Row="1" />
    </Grid>
</Page>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void NavigateButton_Click(object sender, RoutedEventArgs e)
        {
            mainFrame.Navigate(typeof(Page1), null, new Windows.UI.Xaml.Media.Animation.DrillInNavigationTransitionInfo());
        }
    }
Page1:
<Page>
    <VariableSizedWrapGrid ItemWidth="100" ItemHeight="60">
        <Button Padding="20, 10" Content="Hello!"/>
        <Button Padding="20, 10" Content="Hello!"/>
        <Button Padding="20, 10" Content="Hello!"/>
        <Button Padding="20, 10" Content="Hello!"/>
        <Button Padding="20, 10" Content="Hello!"/>

        <!-- And 25 more buttons here -->
    </VariableSizedWrapGrid>
</Page>
    public sealed partial class Page1 : Page
    {
        public Page1()
        {
            this.InitializeComponent();
        }

        ~Page1()
        {
            Debug.WriteLine("Page dead :(");
        }
    }

Полный исходный код доступен на GitHub .

И вы можете посмотреть видео из репродукции.

Я также попытался установить Frame.IsNavigationStackEnabled в false, это не помогает.

Что я здесь не так делаю?

An image of memory use after clicking on the Navigate button for a while

1 Ответ

1 голос
/ 20 июня 2019

Я использую Windows 1803, потому что у меня не последняя версия 1809, но я думаю, что она работает так же,

В коде страницы 1:

 protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);

        System.GC.Collect();
    }

Это еще один способ проверить, должно ли приложение распоряжаться страницами. и это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...