2016-11-18 10 views
5

ऐसा लगता है कि फ़्रेम नेविगेशन (विशेष रूप से फ़्रेम.Navigate (टाइप) विधि) अप्रबंधित स्मृति को लीक कर रहा है।
हर नेविगेशन के बाद जब मैं दृश्य स्टूडियो निदान के औजार को देखो, निजी बाइट्स ऊपर जा रहा है लेकिन जब मैं स्मृति का एक स्नैपशॉट ले, ढेर आकार बढ़ती नहीं है। पृष्ठ जितना अधिक खराब होगा उतना ही खराब है। स्मृति को कभी भी जारी नहीं किया जा रहा है। इससे कोई फर्क नहीं पड़ता कि ऐप डीबग या रिलीज में बनाया गया है (दोनों नेट नेटिव और बिना)। मैं 14393 एसडीके (वर्षगांठ अपडेट) का उपयोग कर रहा हूं।यूडब्ल्यूपी - फ़्रेम नेविगेशन अप्रबंधित स्मृति लीक का कारण बनता है

मैंने एक नमूना ऐप बनाया है जिसमें एक मास्टर पेज और 2 (सामग्री) पृष्ठ हैं जो यह (पृष्ठ लोडेड ईवेंट पर) के बीच नेविगेट करता रहता है। मैंने फ्रेम और पेजों पर कैशसाइज = "0" सेट किया है नेविगेशन कैशमोड = "अक्षम" इसलिए उन्हें कैश नहीं मिलता है। मैं प्रत्येक नेविगेशन से पहले बैकस्टैक को साफ़ कर रहा हूं और पेजयूलोडेड पर प्रत्येक ईवेंट की सदस्यता रद्द कर रहा हूं।

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> 

यहाँ बक्सें वहाँ बेहतर समस्या को दिखाने के लिए कर रहे हैं
यहाँ पन्ने में से एक के लिए .cs फ़ाइल है।
आप here देख सकते हैं कि जैसे ही मैं नेविगेशन निजी बाइट तेजी से बढ़ना शुरू कर देता हूं लेकिन हीप आकार बढ़ता नहीं है।
कैश सक्षम करना (NavigationCacheMode = "आवश्यक") या मैन्युअल रूप से GC.Collect() को कॉल करने में मदद नहीं करता है।
आप पूर्ण स्रोत कोड here देख सकते हैं।

क्या कुछ स्पष्ट है जो मुझे याद आ रही है? क्या मैं सब ठीक से साफ़ नहीं कर रहा हूँ? या शायद रनटाइम अंततः स्मृति जारी करेगा?

धन्यवाद

अद्यतन: एक वीडियो व्यवहार दिखाने के लिए टिप्पणी में देखो

+1

[यहां] (http://i.imgur.com/QuQIaFN.png) (मैं पोस्ट में 2 से अधिक लिंक पोस्ट नहीं कर सकता) दो _Native Heap_ स्नैपशॉट की तुलना है। इससे ऐसा लगता है कि समस्या को XAML टेम्पलेट्स और फ्रेम के बजाय लेआउट के साथ करना है। नेविगेट – Roozi

+0

मैंने एक [लघु वीडियो] (http://www.screencast.com/t/MrBT1ozgwu) रिकॉर्ड किया है जिस पर आप कर सकते हैं मेरे डिवाइस पर व्यवहार। आप यह भी देख सकते हैं कि सक्षम कैश ने मदद नहीं की है। – Roozi

उत्तर

1

मैं पर नजर रखने के परिणाम के बाद से आपकी समस्या को पुनः नहीं कर सकते हैं (मैं अधिक से अधिक 2 लिंक पोस्ट करने के लिए पर्याप्त प्रतिष्ठा नहीं है) आपकी परियोजना के अनुसार मेरी तरफ है। enter image description here मुझे आपकी तस्वीर में गैब संग्रह नहीं मिला। लेकिन मेरी तरफ से जीसी ने अक्सर काम किया है। ध्यान दें कि जीसी वास्तविक समय में नहीं है। आप अपने आप को इकट्ठा करने के लिए GC.Collect Method() का उपयोग करने का प्रयास कर सकते हैं लेकिन किसी उत्पाद में उपयोग करने की अनुशंसा नहीं की जाती है। विवरण आप this thread का संदर्भ दे सकते हैं।

+0

आप जीसी कोलेक्ट्स नहीं देख सकते क्योंकि मैंने रिलीज बिल्ड से एक स्क्रीनशॉट पोस्ट किया है, [यहां] (http://i.imgur.com/vjlH4pK.png) डीबग से एक स्क्रीनशॉट है। मैं इस मुद्दे को कई उपकरणों पर पुन: उत्पन्न करने में सक्षम हूं। क्या आप इसे कुछ और मिनटों तक चलाने की कोशिश कर सकते हैं, मुझे लगता है कि यह देखना आसान होगा। – Roozi

+0

@Roozi मुझे दुख है कि मैं अभी भी कुछ मिनटों के लिए परीक्षण करके इस मुद्दे को पुन: उत्पन्न नहीं कर सकता। मैं परीक्षण पर जाऊंगा। एक और बात, कृपया 'नेविगेशन कैश मोड' को अपनी तरफ से 'आवश्यक' पर सेट करने का प्रयास करें और फिर से परीक्षण करें। कैश मोड को अक्षम करें डेटा को कैश नहीं करेगा, असल में जब भी आप पृष्ठ पर नेविगेट करेंगे तो नए उदाहरण बनाएंगे जो स्मृति को बढ़ा सकते हैं। –

+0

@Roozi, यदि आप मैन्युअल रूप से जीसी परिणाम प्राप्त करते हैं तो क्या परिणाम है? –

संबंधित मुद्दे