2010-01-27 20 views
8

क्या यह प्रोग्रामर के हिस्से पर स्मृति को गतिशील रूप से आवंटित और अस्वीकृत करने के मूल गलतफहमी के कारण है? क्या यह प्रसन्नता के कारण है?मेमोरी लीक क्यों आम हैं?

+3

व्यक्तिगत रूप से, मुझे लगता है कि यह 40% अज्ञानता, 40% लापरवाही, और 20% आलस्य है। – ChaosPandion

+7

मानव होने के नाते ... – bryantsai

उत्तर

15

नहीं। यह प्रत्येक स्मृति आवंटन का ट्रैक रखने के लिए बहुत अधिक लेखांकन के कारण होता है। स्मृति आवंटित करने के लिए कौन जिम्मेदार है? इसे मुक्त करने के लिए कौन जिम्मेदार है? यह सुनिश्चित करना कि आप स्मृति को आवंटित करने और मुक्त करने के लिए एक ही एपीआई का उपयोग करते हैं ... सुनिश्चित करें कि आप हर संभव प्रोग्राम प्रवाह को पकड़ें और हर स्थिति में साफ करें (उदाहरण के लिए, सुनिश्चित करें कि आप त्रुटि या अपवाद को पकड़ने के बाद साफ हो जाएं)। सूची जारी है ...

+5

+1 अच्छी तरह से कहा, यह एक _hard_ समस्या –

+2

+1 Ditto है। यही वह सब कुछ है जो मैं कहना चाहता था और अधिक। मुझे सिर्फ अनियंत्रित एपीआई के लोगों से प्यार है, मुझे उम्मीद है कि मुझे स्मृति आवंटन के कुछ डिवीजनिंग गुरु होने की उम्मीद है। – wheaties

+0

@ जॉन - क्या मुझे आपकी टिप्पणी में जोर देने के लिए बचपन में माना जाता है? – ChaosPandion

3

एक सभ्य आकार की परियोजना में, कोई आवंटित संसाधनों का ट्रैक खो सकता है।

कभी-कभी एक फ़ंक्शन को एक प्रारंभिक डेटा संरचना की अपेक्षा की जाती है जो इनपुट के रूप में शुरू होती है। कोई डेटा संरचना में गुजरता है जो पहले से ही शुरू हुआ है, और इस प्रकार पहले आवंटित स्मृति लीक हो गई है।

मेमोरी लीक मूल गलतफहमी के कारण होते हैं प्रत्येक बग है। और मैं किसी को भी हर बार पहली बार बग फ्री कोड लिखने के लिए चौंक गया होगा। मेमोरी लीक बस उस प्रकार की बग होने लगती है जो शायद ही कभी दुर्घटना या स्पष्ट रूप से गलत व्यवहार का कारण बनती है (ज़ाहिर है कि बहुत अधिक मेमोरी का उपयोग करने के अलावा), इसलिए जब तक डेवलपर के लिए मेमोरी लीक का स्पष्ट रूप से परीक्षण नहीं किया जाता है, तो शायद यह कभी नहीं पता कि वे मौजूद हैं। यह देखते हुए कि कोडबेस में परिवर्तन हमेशा बग जोड़ते हैं, और मेमोरी लीक वर्चुअल अदृश्य होते हैं, मेमोरी लीक प्रोग्राम की उम्र के रूप में विस्तारित होते हैं और आकार में फैलते हैं।

यहां तक ​​कि स्वचालित मेमोरी प्रबंधन वाली भाषाओं में भी, कचरा संग्रह एल्गोरिदम के आधार पर स्मृति को चक्रीय संदर्भों के कारण लीक किया जा सकता है।

2

मुझे लगता है कि यह नौकरी में काम करने के दबावों के कारण है जिसके लिए मृत रेखाएं और ऊपरी प्रबंधन की आवश्यकता होती है ताकि परियोजना को दरवाजा बाहर निकाला जा सके। तो आप परीक्षण कर सकते हैं, परीक्षण के साथ, क्यू & ए, ऐसे दबाव वाले वातावरण में पीयर कोड समीक्षा, कि मेमोरी लीक नेट के माध्यम से फिसल सकता है।

चूंकि आपके प्रश्न में भाषा का उल्लेख नहीं किया गया है, इसलिए, स्वचालित मेमोरी प्रबंधन है जो मेमोरी एकाउंटिंग/ट्रैकिंग का ख्याल रखता है ताकि कोई मेमोरी लीक न हो, जावा/.NET सोचें, लेकिन कुछ नेट के माध्यम से फिसल सकते हैं। यह सी/सी ++ की पसंद के साथ होता था जो malloc/new फ़ंक्शंस का उपयोग करता है, और स्मृति आवंटित होने की तीव्र मात्रा के कारण, हमेशा जांचना कठिन होता है।

फिर फिर, उन लीक को ट्रैक करना मुश्किल हो सकता है जो इस उत्तर में एक और वक्रबॉल फेंक रहा है - यह है कि यह देव की मशीन पर काम करता है जो यह प्रदर्शित नहीं होता है, लेकिन जब उत्पादन में, स्मृति शुरू होती है नरक की तरह लीक करना, क्या यह कॉन्फ़िगरेशन, हार्डवेयर, सॉफ़्टवेयर कॉन्फ़िगरेशन या इससे भी बदतर है, स्मृति रिसाव यादृच्छिक स्थिति में दिखाई दे सकती है जो उत्पादन वातावरण के भीतर अद्वितीय है, या यह समय/लागत बाधा है जो स्मृति रिसाव होने की अनुमति देती है या क्या यह है कि स्मृति प्रोफाइलिंग उपकरण लागत निषिद्ध हैं या देव टीम को लीक को ट्रैक करने में मदद करने के लिए धन की कमी है ...

सभी में, प्रत्येक और प्रत्येक देव टीम के भीतर, कोड की काम सुनिश्चित करने के लिए अपनी ज़िम्मेदारी है , और स्मृति प्रबंधन के बारे में नियमों को जानना (उदाहरण के लिए, इस तरह के हर malloc के लिए के रूप में वहाँ एक free होना चाहिए, के लिए हर new होना चाहिए एक delete), लेकिन कोई दोष देव टीम के लिए खुद को जिम्मेदार होना चाहिए, न तो है 'देव टीम पर दबाव डालने' के लिए प्रबंधन में ओर इशारा करते हुए उंगली।

दिन के अंत में, यह केवल देव टीम पर भरोसा करने और उनके कंधों पर 'प्रसन्नता' रखने के लिए झूठी अर्थव्यवस्था होगी।

उम्मीद है कि यह मदद करता है, सर्वश्रेष्ठ संबंध, टॉम।

+1

मेमोरी लीक बस बग हैं। प्रोग्रामर के रूप में आपके ऊपर दबाव आपको अधिक गलतियां कर सकता है (यह मेरे साथ होता है), लेकिन बिना किसी दबाव के, आपको अभी भी लीक मिल जाएगी। यह सिर्फ एक मुश्किल समस्या है। –

1
  1. कीड़े।

  2. यहां तक ​​कि बग के बिना, यह जानना असंभव हो सकता है कि कार्य को स्मृति को रद्द करना चाहिए। कोड संरचना संरचना अनिवार्य रूप से कार्यात्मक है (मुख्य कार्य उप-फ़ंक्शंस को कॉल करता है, जो डेटा को संसाधित करता है, फिर परिणाम देता है), लेकिन यह बहुत छोटा नहीं है यदि कई ट्रेड (या कई अलग-अलग ऑब्जेक्ट) स्मृति का एक टुकड़ा साझा करते हैं तो यह छोटा नहीं है। स्मार्ट पॉइंटर्स का उपयोग किया जा सकता है (सी ++ में), लेकिन अन्यथा यह कम या ज्यादा असंभव है।

  3. लीक्स सबसे खराब प्रकार की बग नहीं हैं। उनका प्रभाव आम तौर पर प्रदर्शन में एक संचयी गिरावट है (जब तक आप स्मृति से बाहर नहीं हो जाते), इसलिए वे केवल प्राथमिकता के रूप में उच्च नहीं हैं।

1

संरचित स्कॉप्स की कमी और आवंटित स्मृति के स्पष्ट स्वामित्व।

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