c# - नेविगेशन पर यूडब्ल्यूपी विंडोज 10 ऐप मेमोरी बढ़ रही है




memory win-universal-app windows-10 uwp (4)

क्या हम आपका एक्सएमएल कोड देख सकते हैं? क्या आप अपने xaml में x: name का उपयोग कर रहे हैं और क्या यह नष्ट हो रहा है? यदि ऐसा है तो आपकी याददाश्त रिसाव हो सकती है।

यदि आप एक्स का उपयोग कर रहे हैं तो इस लिंक को http://support.scichart.com/index.php?/News/NewsItem/View/21/wpf-xname-memory-leak--how-to-clear-memory-in-scichart : नाम: http://support.scichart.com/index.php?/News/NewsItem/View/21/wpf-xname-memory-leak--how-to-clear-memory-in-scichart

बेशक एक यूडब्ल्यूपी एक्स को संभालने में सक्षम हो सकता है: नाम अलग-अलग ...

मेरे पास एक यूडब्ल्यूपी विंडोज 10 ऐप है और मैंने देखा कि कार्य प्रबंधक में स्मृति उपयोग समय के साथ बढ़ रहा है।

मैंने ऐप को वापस फिसल दिया और पाया कि नेविगेटिंग पेजों पर स्मृति बढ़ रही है। इसलिए मैंने परीक्षण के लिए केवल कुछ पृष्ठों के साथ एक सरल ऐप बनाया और इस सरल ऐप में स्मृति अभी भी बढ़ रही है। मेरे पास एक मुख्य पृष्ठ है जो पृष्ठ 1 से पृष्ठ 2 तक और एक टाइमर पर वापस फ्रेम बनाता है।

    public sealed partial class MainPage : Page
{

    private DispatcherTimer _timer;

    private bool _page1Showing;
    private bool _timerRunning;

    public MainPage()
    {
        this.InitializeComponent();

        _timer = new DispatcherTimer();
        _timer.Interval = new TimeSpan(0, 0, 0, 0, 200);
        _timer.Tick += _timer_Tick;
    }

    private void _timer_Tick(object sender, object e)
    {
        GC.Collect();

        this.rootFrame.BackStack.Clear();
        this.rootFrame.ForwardStack.Clear();

        if (_page1Showing)
        {
            this.rootFrame.Navigate(typeof(Page2));
            _page1Showing = false;
        }
        else
        {
            this.rootFrame.Navigate(typeof(Page1));
            _page1Showing = true;
        }
    }


    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (_timerRunning)
        {
            _timer.Stop();
            _timerRunning = false;
        }
        else
        {
            _timer.Start();
            _timerRunning = true;
        }
    }

}

पृष्ठ 1 और पृष्ठ 2 पृष्ठभूमि रंग वाले ग्रिड वाले खाली पृष्ठ हैं ताकि आप नेविगेशन देख सकें। जबकि यह ऐप कार्य प्रबंधक में मेमोरी उपयोग चलाता है, हर 30 मिनट में लगभग 1 एमबी तक बढ़ता है।

मैंने वीएस2015 में मेमोरी डायग्नोस्टिक्स का उपयोग करके ऐप चलाया है, प्रबंधित ढेर अपेक्षित है:

ढेर हमेशा बढ़ रहा है:

हीप के स्नैपशॉट की तुलना में दिखाता है:

मैं उलझन में हूं कि ये मैकइंटरपॉप ऑब्जेक्ट्स क्या हैं? और स्मृति उपयोग में हमेशा इतना आसान ऐप क्यों बढ़ रहा है। मेरा मुख्य ऐप लंबे समय तक चलने की जरूरत है (महीने +)। किसी भी मदद की सराहना करते हैं।

मैंने पृष्ठों को नेविगेशन कैशमोड को बदलने की कोशिश की है, यदि आवश्यक हो तो पेज एक बार बनाए जाते हैं। यदि अक्षम करने के लिए सेट किया गया है तो पेज हर बार बनाए जाते हैं, और मैंने जांच की कि फाइनल को अपेक्षित कहा जाता है।

-

संपादित करें : मैंने टाइमर को शुरू करने और रोकने के लिए एक बटन जोड़ा (ऊपर अपडेट किया गया)। ऐसा लगता है कि टाइमर चल रहा है जब टास्क मैनेजर में मेमोरी उपयोग बढ़ जाएगा, जब टाइमर बंद हो जाता है तो स्मृति उपयोग अंततः गिर जाता है।

मैंने एक दिन में टास्क मैनेजर में मेमोरी उपयोग को मापने और टाइमर को हर 2 घंटों के आसपास रोकने के लिए मापा, यह धीरे-धीरे बढ़ता है और फिर किसी बिंदु पर गिर जाता है:

12.5 -> 17.1 -> 16.7 -> 13.9 -> 16.8 -> 22.5 -> 13.6 -> 14.6 -> 24.9 -> 15.2

तो मुझे लगता है कि सब कुछ ठीक काम कर रहा है? लेकिन मुझे यह नहीं पता कि यहां क्या हो रहा है, यह इतना क्यों बढ़ रहा है? यह किस स्थितियों के तहत मुक्त किया जा रहा है?

क्या सिस्टम नेविगेट करते समय स्मृति को जारी करने में देरी हो रही है? जब उपयोगकर्ता आमतौर पर स्क्रीन के साथ बातचीत कर रहा होगा?


मैंने w8.1 पर एक ही समस्या देखी है, प्रिंटिंगइनलाइन के साथ आकर्षण का उपयोग करके यह एप्लिकेशन की दुर्घटना तक 1.5 मेमोरी तक बहुत सारी मेमोरी ले रहा है। लेकिन मानक आपको GC.colect () की आवश्यकता नहीं है, यह स्वचालित रूप से काम करता है।


प्रत्येक बार जब आप किसी पृष्ठ पर नेविगेट करते हैं, तो आप पृष्ठ का एक नया उदाहरण बनाते हैं, लेकिन पिछले पृष्ठ का निपटारा नहीं किया जाता है (भले ही पृष्ठ नेविगेशन स्टैक में पहले से ही हो)।

उसी पृष्ठ के एकाधिक आवंटन को रोकने के लिए, पृष्ठ पर NavigationCacheMode="Enabled" विशेषता सेट करें।

साथ ही, स्मृति आवंटन को कम करने के लिए, आपको विधि को OnNavigatedTo और OnNavigatedFrom OnNavigatedTo को ओवरराइड करना होगा।

OnNavigatedTo विधि में:

  • सभी स्मृति गहन वस्तु या संसाधनों को तत्काल करें
  • आपको आवश्यक सभी ईवेंट हैंडलर जोड़ें
  • सभी टाइमर, कार्य या धागे शुरू होता है

OnNavigatedFrom :

  • सभी संसाधनों का निपटान करें
  • सभी टाइमर, कार्य या धागे को रोकता है
  • सभी भारी वस्तुओं से संदर्भ हटा दें
  • सभी घटनाओं हैंडलर निकालें
  • केवल अगर आपको वास्तव में आवश्यकता है, तो जीसी कॉल करें। ()

डंप एक वैश्विक विस्तार विधि है और सबमिट चेंज डेटाकॉन्टेक्स्ट ऑब्जेक्ट से आता है जो एक System.Data.Linq.DataContext ऑब्जेक्ट है।

एलपी केवल डंप और डिस्सेबल को जोड़ता है जहां तक ​​मुझे पता है। हालांकि मैं इसे प्रतिबिंबित करने में अत्यधिक अनुशंसा करता हूं कि यह देखने के लिए कि और क्या उपयोग किया जा सकता है। अधिक दिलचस्प चीजों में से एक LINQPad है। नामस्थान के रूप में जिसमें कुछ सामान हैं जो LINQPad द्वारा आंतरिक रूप से उपयोग किए जाते हैं।





c# memory win-universal-app windows-10 uwp