2011-08-26 10 views
5

से हटाया नहीं गया है मुझे एएसपी.NET एप्लिकेशन के साथ वास्तव में खराब स्मृति समस्याएं आई हैं। ऐसा लगता है जैसे पृष्ठ लोड होने पर हर बार, पृष्ठ का पुराना पिछला उदाहरण स्मृति से नहीं हटाया जाता है। यदि आप दस बार दस बार दबाते हैं, तो स्मृति उदाहरण के लिए 10-20 एमबी जोड़ता है। तनाव और प्रदर्शन परीक्षण के दौरान, यह स्मृति को अधिकतम करेगा और वेब सर्वर क्रैश हो जाएगा ...एएसपी.NET पृष्ठ स्मृति

मैंने एएनटीएस मेमोरी प्रोफाइलिंग चलाई और यह पुष्टि की कि हर बार जब कोई पृष्ठ लोड होता है, तो पुराना इंस्टेन स्मृति में रहता है। मेरे सभी एएसपी.नेट वेब पेज एक मास्टर पेज का भी उपयोग करते हैं। फिर, अगर मैं पृष्ठ पर 10 बार, तो वेब पेज मौजूद है के 10 उदाहरणों, साथ ही मास्टर पेज के 10 उदाहरणों ...

http://oi51.tinypic.com/21msy2g.jpg

चींटियों प्रोफाइलर परिणाम को देखते हुए लोड, आप देख सकते हैं कि प्रत्येक पृष्ठ रीलोड स्मृति के लिए लगभग 320 केबी जोड़ता है, और यह केवल वेब पेज है, यहां तक ​​कि मास्टर पेज को खाते में भी नहीं ले रहा है। मेरा आवेदन एक जीवन बीमा ऐप है जो अनुप्रयोगों को कैप्चर करता है, इसलिए यह लगभग 30-40 पृष्ठों से गुजरता है। तो आप देख सकते हैं कि यह एक बड़े पैमाने पर समस्या क्यों है।

पृष्ठ को स्मृति में रखने के बारे में मैं यह कैसे पता लगाऊंगा? मुझे नहीं पता कि कहां से शुरू करना है ...: \

मेरे सभी पृष्ठ सेवा पंजीकरण के लिए एकता और निर्भरता इंजेक्शन का उपयोग करते हैं ... सुनिश्चित नहीं है कि मुझे पृष्ठ_ऑनलोड के दौरान इन सेवाओं को अनधिकृत करने की आवश्यकता है या नहीं।

संपादित

ठीक है, मैं इस मुद्दे को ट्रैक करने प्रबंधित किया है। पृष्ठ का निपटारा क्यों नहीं किया गया है (GCollected) एकता सेवा उदाहरणों के कारण है जो पंजीकृत है लेकिन पेज के अनलोड के दौरान अपंजीकृत है। इस तरह मैं अपने पन्ने पर एकता का उपयोग कर रहा:

मैं सार्वजनिक संपत्तियों के माध्यम से सेवाओं इंजेक्षन

#region Services 

    [Dependency] 
    public ReviewReportService SummaryService { get; set; } 

    [Dependency] 
    public Portfolios.PortfolioService PortfolioService { get; set; } 

    #endregion 

तो पेज init, मैं एकता Buildup करना: अब स्पष्ट रूप से जब

protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 

        ApplicationContainer.BuildUp(this.Context, this); 
      } 

पृष्ठ अपने सामान्य जीवन चक्र से गुजरता है और अनलोड को कॉल करता है, यह निर्भरता इंजेक्शन संदर्भ के कारण अनलोड नहीं किया जा सकता है ... मुझे यकीन नहीं है कि सेवाओं को अनियंत्रित कैसे किया जाए (सारांश सेवा, पोर्टफोलियो सेवा)

मैंने ऑनयूनल में निम्नलिखित को कॉल करने का प्रयास किया लेकिन यह कुछ भी नहीं करता:

एप्लिकेशनकंटनर.गेटकॉन्टेनर (संदर्भ)। टायरडाउन (यह);

उत्तर

0

पर शब्द स्थिर (सी #) या साझा (VB) के लिए कोई खोज करते हैं अंक एकता के कारण हुई थी और यह लाइफटाइम प्रबंधक है।मुझे एक अलग एकता लाइफटाइम मैनेजर का उपयोग करना पड़ा जो मूल रूप से एक नया कंटेनर देता है जब कोई पृष्ठ बिल्डअप करता है। पृष्ठ के अनलोड पर, टियरडाउन को कंटेनर पर बुलाया जाता है और इसका निपटारा किया जाता है, जो इंजेक्शन गुणों के सभी लिंक जारी करता है। इसने मेरी समस्या हल की :)

1

आपके पास कहीं भी पृष्ठ का स्थिर संदर्भ है और इसे निपटान नहीं किया जा सकता है।

+1

मैं कैसे निर्धारित करूं कि मेरे पास पृष्ठ का स्थिर संदर्भ है या नहीं? यह पहचानने के किसी भी तरीके से कौन सा ऑब्जेक्ट इसका संदर्भ दे रहा है? – FaNIX

0

मैं निश्चित रूप से सेवाओं को अपंजीकृत करके शुरू करूंगा। मैंने इस मुद्दे के कारण भारी मेमोरी लीक देखी है (हालांकि उस उदाहरण में एकता का उपयोग नहीं किया जा रहा था)।

इसके अलावा, चारों ओर देखो और देखें कि क्या आप पेज वैरिएबल का उपयोग ऐसे तरीके से कर रहे हैं जो इसे कचरा इकट्ठा करने से रोक रहा हो।

0

मैं जाँच करेगा अगर एक स्थिर colletion पेज/मास्टर पृष्ठ पर कहीं भी मौजूद बस पूरी परियोजना

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