2016-11-18 25 views
5

フレームナビゲーション(特にFrame.Navigate(タイプ)メソッド)がアンマネージメモリをリークしているようです。すべてのナビゲーション後
は私がVisual Studioの診断ツールを見たとき、プライベートバイトが上がっているが、私は、メモリのスナップショットを撮るとき、ヒープサイズが増加していません。より多くのコンポーネントがページを悪化させるほどです。メモリは解放されていないようです。アプリがDebugかRelease(どちらも.Net NativeとNon)でビルドされているかどうかは関係ありません。私は14393 SDK(Anniversaryアップデート)を使用しています。UWP - フレームナビゲーションで管理されないメモリリークが発生するようです。

私はマスターページとその間をナビゲートする2つの(コンテンツ)ページを持つサンプルアプリケーションを作成しました(PageLoadedイベント)。私はに設定しました。フレームにはCacheSize = "0"、ページにはNavigationCacheMode = "無効"がキャッシュされません。また、すべてのナビゲーションの前にバックスタックをクリアし、PageUnloadedのすべてのイベントを登録解除します。

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> 

テキストボックスがあります。ここ
は、ページの1のためには.csファイルです。
は、ナビゲーションを開始するとすぐに表示されます。プライベートバイトは急速に増加し始めますが、ヒープサイズは増加しません。
キャッシュを有効にする(NavigationCacheMode = "Required")、またはGC.Collect()を手動で呼び出すことは役に立ちません。
完全なソースコードhereを見ることができます。

紛失しているものがありますか?私はすべてを適切にクリアしていないのですか?あるいは、ランタイムは最終的にメモリを解放するでしょうか?

はあなたに

更新をありがとう:挙動を示す動画のコメントに見て

+1

[ここ](http://i.imgur.com/QuQIaFN.png)(2つ以上のリンクを投稿できません)は、2つの_Native Heap_スナップショットの比較です。これは、問題がFrameではなくXAMLのテンプレートやレイアウトと関係しているように見えます.Navigate – Roozi

+0

[ショートビデオ](http://www.screencast.com/t/MrBT1ozgwu)を録音しました。私のデバイス上の動作。また、キャッシュを有効にしても役立たないことがわかります。 – Roozi

答えて

1

私は、モニタ結果ので、あなたの問題を再現することはできません(私は2つの以上のリンクを投稿するのに十分な評判を持っていません)あなたのプロジェクトの私の側では次のようになります。 enter image description here 私はあなたの写真にガブリコレクションを見ませんでした。しかし、私の側ではGCが頻繁に働いています。GCはリアルタイムではありません。 GC.Collect Method()を使用して自分で収集することはできますが、製品での使用はお勧めしません。詳細はthis threadを参照してください。

+0

リリースビルドからスクリーンショットを投稿したため、GC colectsが表示されません。[ここ](http://i.imgur.com/vjlH4pK.png)はDebugのスクリーンショットです。私は複数のデバイスで問題を再現できました。あなたはそれを数分以上動かしてみてください。私はそれが見やすいと思います。 – Roozi

+0

@Roozi悲しいことに、私はまだ数分間テストしても問題を再現できません。私はテストに行きます。もう一つ、あなたの側で 'NavigationCacheMode'を' Required'に設定して、もう一度テストしてみてください。キャッシュモードを無効にするとデータはキャッシュされませんが、実際にページに移動するたびに新しいインスタンスが作成され、メモリが増加する可能性があります。 –

+0

@Roozi、手動でGCを実行するとどうなりますか? –

関連する問題