2010-11-10 27 views
27

जब हम कहते हैं एक कार्यक्रम स्मृति लीक, एक नई एक बिना ग में हटाना कहना ++, यह वास्तव में रिसाव करता है? मेरा मतलब है, जब प्रोग्राम समाप्त होता है, क्या वह स्मृति अभी भी कुछ गैर-चल रहे प्रोग्राम को आवंटित की जाती है और इसका उपयोग नहीं किया जा सकता है, या ओएस जानता है कि प्रत्येक प्रोग्राम द्वारा किस स्मृति का अनुरोध किया गया था, और प्रोग्राम समाप्त होने पर इसे रिलीज़ करता है? अगर मैं उस कार्यक्रम को कई बार चलाता हूं, तो क्या मैं स्मृति से बाहर हो जाऊंगा?क्या एक एप्लिकेशन मेमोरी रिसाव एक ऑपरेटिंग सिस्टम मेमोरी रिसाव का कारण बनता है?

+0

संभावित डुप्लिकेट [सी, सी ++ में मेमोरी लीक; मुक्त करने के लिए भूल गए, हटाएं] (http://stackoverflow.com/questions/1232262/memory-leak-in-cc-forgot-to-do-free-delete) – nmichaels

+0

मैं सी ++ सीख रहा हूं, और मुझे डर है कि हर समय मैं अपने कार्यक्रम चलाने के लिए, मैं और अधिक स्मृति (मैं अभी भी अपने स्मृति प्रबंधन कौशल पर काम कर रहा हूँ) – baruch

+0

उपयोग कर रहा हूँ इसके अलावा http://stackoverflow.com/questions/104/anatomy-of-a-memory-leak –

उत्तर

19

संरक्षित स्मृति ऑपरेटिंग सिस्टम पर (मैक ओएस 10+, सभी यूनिक्स क्लोन जैसे लिनक्स, और जैसा कि NT- आधारित विंडोज सिस्टम Windows 2000 और युवा अर्थ), स्मृति जारी किया जाता है जब कार्यक्रम समाप्त होता है।

यदि आप किसी प्रोग्राम को अक्सर बंद करने के बिना पर्याप्त रूप से पर्याप्त (बिना किसी और समय में चल रहे) चलाते हैं, तो आप अंततः स्मृति से बाहर हो जाएंगे, चाहे स्मृति मेमोरी हो या नहीं, तो यह भी है मेमोरी लीक के साथ कार्यक्रमों के सच। जाहिर है, स्मृति को लीक करने वाले प्रोग्राम मेमोरी लीक के बिना एक समान प्रोग्राम की तुलना में स्मृति को तेज़ी से भर देंगे, लेकिन स्मृति को भरने के बिना आप कितनी बार इसे चला सकते हैं, इस पर निर्भर करता है कि प्रोग्राम को सामान्य ऑपरेशन के लिए कितनी मेमोरी की आवश्यकता है, चाहे स्मृति रिसाव हो या नहीं। यह तुलना वास्तव में कुछ भी लायक नहीं है जब तक आप दो पूरी तरह से समान कार्यक्रमों की तुलना नहीं कर रहे हों, एक मेमोरी रिसाव के साथ और बिना किसी के।

मेमोरी लीक सबसे गंभीर हो जाते हैं जब आप एक प्रोग्राम एक बहुत लंबे समय के लिए चल रहा है। इसका क्लासिक उदाहरण सर्वर सर्वर है, जैसे वेब सर्वर। उदाहरण के लिए, गेम या स्प्रेडशीट प्रोग्राम या वर्ड प्रोसेसर के साथ, मेमोरी लीक लगभग गंभीर नहीं हैं क्योंकि आप अंततः उन प्रोग्राम को बंद कर देते हैं, स्मृति को मुक्त करते हैं। लेकिन निश्चित रूप से स्मृति रिसाव खराब छोटे जानवर हैं जिन्हें हमेशा सिद्धांत के मामले में निपटाया जाना चाहिए।

लेकिन जैसा कि पहले बताया गया है, कार्यक्रम समाप्त होने पर सभी आधुनिक ऑपरेटिंग सिस्टम स्मृति जारी करते हैं, इसलिए स्मृति मेमोरी के साथ भी, यदि आप लगातार प्रोग्राम खोल रहे हैं और बंद कर रहे हैं तो आप स्मृति को भर नहीं पाएंगे।

+0

उत्सुक: सभी कार्यक्रम स्मृति को रिसाव क्यों करते हैं?क्या आप कह रहे हैं कि यह वॉन न्यूमैन आर्किटेक्चर की मूलभूत विशेषता है, या सभी कार्यक्रमों में अनिवार्य रूप से कोडिंग त्रुटियां हैं? –

+2

मुझे लगता है कि बिंदु यह है कि सभी प्रोग्राम * स्मृति * का उपयोग करते हैं, कुछ दूसरों की तुलना में अधिक कुशलतापूर्वक। कुछ प्रोग्राम जो तकनीकी रूप से रिसाव नहीं करते हैं, अभी भी स्मृति का उपयोग बहुत अक्षमता से करते हैं (इसे अंततः जारी किए जाने के बावजूद इसे आवंटित करने के लिए आवंटित किया जाता है)। –

+0

कोई प्रोग्राम स्मृति से बाहर नहीं होगा। नंगे-हड्डियों के ओएस कर्नेल के बारे में सोचें जो वर्षों से नॉनस्टॉप चलाते हैं - यह भी एक कार्यक्रम है। – orip

3

जब प्रक्रिया समाप्त होती है, तो स्मृति भी साफ़ हो जाती है। समस्या यह है कि यदि कोई प्रोग्राम स्मृति को रिसाव करता है, तो यह ओएस को चलाने के लिए अधिक से अधिक अनुरोध करेगा, और संभवतः ओएस को क्रैश कर सकता है।

14

निष्पादन बंद होने के बाद लीक मेमोरी ओएस द्वारा वापस आती है।

यही कारण है कि यह हमेशा डेस्कटॉप अनुप्रयोगों के साथ एक बड़ी समस्या नहीं है, लेकिन यह सर्वर और सेवाओं के साथ एक बड़ी समस्या है (वे लंबे समय तक चलते हैं।)।

  1. कार्यक्रम एक ओएस
  2. ओएस के निशान के रूप में एक द्वारा इस्तेमाल किया गया ब्लॉक एक्स और कार्यक्रम को वापस करती से स्मृति से पूछते हैं:

    इस परिदृश्य को देखने की सुविधा देता है।

  3. कार्यक्रम में एक्स
  4. के लिए सूचक होना चाहिए प्रोग्राम प्रोग्राम स्मृति देता है।
  5. ओएस ब्लॉक को मुफ्त में चिह्नित करता है। ब्लॉक का उपयोग अब परिणाम उल्लंघन में परिणाम होता है।
  6. प्रोग्राम एक सिरों और ए द्वारा उपयोग की जाने वाली सभी मेमोरी को अप्रयुक्त चिह्नित किया गया है।

इसके साथ कुछ भी गलत नहीं है।

लेकिन अगर स्मृति एक पाश में आवंटित किया जाता है और नष्ट भुला दिया जाता है, तो आप वास्तविक समस्याओं में चलाने:

  1. कार्यक्रम एक ओएस
  2. ओएस से स्मृति पूछना के निशान के रूप में इस्तेमाल किया गया ब्लॉक एक्स ए द्वारा और इसे कार्यक्रम में लौटाता है।
  3. कार्यक्रम एक्स
  4. गोटो 1

ओएस स्मृति से बाहर चलाता है एक सूचक होना चाहिए, इस कार्यक्रम शायद दुर्घटना होगा।

5

नहीं। एक बार जब ओएस प्रोग्राम बंद कर देता है, तो स्मृति वापस आती है (एक उचित आधुनिक ओएस दिया जाता है)। समस्या लंबी चल रही प्रक्रियाओं के साथ है।

3

यह इस अर्थ में अधिक लीक है कि कोड के पास स्मृति के टुकड़े पर कोई और पकड़ नहीं है।

36

नहीं, सभी व्यावहारिक ऑपरेटिंग सिस्टम में, जब कोई प्रोग्राम निकलता है, तो उसके सभी संसाधन ओएस द्वारा पुनः दावा किए जाते हैं। मेमोरी लीक उन कार्यक्रमों में एक और गंभीर समस्या बन जाती है जो एक विस्तारित समय और/या कार्यों के लिए चलती रहती हैं जिन्हें अक्सर एक ही कार्यक्रम से बुलाया जा सकता है।

+0

की ' इसके सभी संसाधन '- यह कुछ लगातार वस्तुओं के लिए सच नहीं है, प्रक्रिया के लिए ओएस द्वारा आवंटित, जैसे एसआईएसवी आईपीसी डिस्क्रिप्टर (कुछ शम ऑब्जेक्ट्स भी हैं), और कुछ विधवा हैंडलर हैं। – osgx

+0

तो, क्या कोई नया/मॉलोक होने पर हमेशा हटाने/मुक्त करने का बेहतर अभ्यास है? – jokoon

2

ओएस प्रोग्राम समाप्त होने पर स्मृति जारी कर सकता है। यदि किसी प्रोग्राम में रिसाव मौजूद है तो प्रोग्राम चल रहा है, यह केवल एक मुद्दा है। सर्वर प्रक्रियाओं जैसे लंबे समय तक चलने वाले कार्यक्रमों के लिए यह एक समस्या है।या उदाहरण के लिए, यदि आपके वेब ब्राउजर में मेमोरी रिसाव था और आपने इसे दिनों तक चलाना जारी रखा तो यह धीरे-धीरे अधिक मेमोरी का उपभोग करेगा।

2

जहाँ तक मुझे पता है, सबसे ओएस पर जब एक कार्यक्रम शुरू कर दिया है यह स्मृति का एक निर्धारित अनुभाग जो पूरी तरह से मुक्त एक बार कार्यक्रम समाप्त हो गया है हो जाएगा प्राप्त करता है।

मेमोरी लीक मुख्य कारणों में से एक है क्योंकि कचरा कलेक्टर एल्गोरिदम का आविष्कार किया गया था, एक बार रनटाइम में प्लग होने के बाद, वे उस स्मृति को पुनः प्राप्त करने में ज़िम्मेदार हो जाते हैं जो किसी प्रोग्राम द्वारा अब तक पहुंच योग्य नहीं है।

1

मेमोरी लीक निष्पादन के पिछले अंत तक नहीं टिकते हैं इसलिए किसी भी स्मृति रिसाव के लिए "समाधान" प्रोग्राम निष्पादन को समाप्त करना है। स्पष्ट रूप से यह कुछ प्रकार के सॉफ्टवेयर पर एक मुद्दा है। मेमोरी लीक के कारण प्रत्येक 8 घंटे ऑफ़लाइन जाने के लिए डेटाबेस सर्वर होने के कारण वीडियो गेम की तुलना में एक समस्या अधिक होती है जिसे लगातार 8 घंटे के बाद पुनरारंभ करने की आवश्यकता होती है।

अवधि "रिसाव" तथ्य यह है कि समय के साथ स्मृति की खपत किसी भी वृद्धि हुई लाभ के बिना विकसित कर देंगे। "लीक" स्मृति स्मृति है न तो प्रोग्राम द्वारा उपयोग की जाती है और न ही ओएस (और अन्य प्रोग्राम) द्वारा प्रयोग योग्य है।

दुर्भाग्य से मेमोरी लीक अप्रबंधित कोड में बहुत आम हैं। मेरे पास कुछ दिनों के लिए फ़ायरफ़ॉक्स चल रहा है और केवल 4 टैब खुले होने के बावजूद मेमोरी उपयोग 424 एमबी है। अगर मैंने फ़ायरफ़ॉक्स बंद कर दिया और उसी टैब को फिर से खोला तो स्मृति उपयोग < 100MB होगा। इस प्रकार 300+ एमबी "लीक" है।

+2

आपका फ़ायरफ़ॉक्स उदाहरण जरूरी नहीं है कि एक रिसाव हो। कार्यक्रम पहले से आवंटित स्मृति को "पूल" में रख सकते हैं और इसे हर बार रिलीज़ करने और फिर से आवंटित करने के बजाय इसका पुन: उपयोग कर सकते हैं। यह केवल एक "रिसाव" है यदि प्रोग्राम अब इसका संदर्भ नहीं रखता है, इस प्रकार इसे पहुंचने योग्य बनाता है। – baruch

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