मेमोरी विखंडन डिस्क विखंडन के रूप में एक ही अवधारणा है: यह अंतरिक्ष को बर्बाद होने के लिए संदर्भित करता है क्योंकि उपयोग में आने वाले क्षेत्रों को एक साथ पर्याप्त रूप से पैक नहीं किया जाता है।
एक सरल खिलौना उदाहरण के लिए मान लीजिए कि आपके पास स्मृति के दस बाइट हैं:
| | | | | | | | | | |
0 1 2 3 4 5 6 7 8 9
अब तीन तीन-बाइट ब्लॉक आवंटित करते हैं, नाम A, B और C:
| A | A | A | B | B | B | C | C | C | |
0 1 2 3 4 5 6 7 8 9
अब डीलॉक ब्लॉक B को निपटाएं:
| A | A | A | | | | C | C | C | |
0 1 2 3 4 5 6 7 8 9
अब क्या होगा अगर हम चार-बाइट ब्लॉक डी को आवंटित करने का प्रयास करते हैं? ठीक है, हमारे पास मेमोरी बाइट्स के चार बाइट्स हैं, लेकिन हमारे पास मेमोरी के चार सन्निहित बाइट्स नहीं हैं , इसलिए हम डी आवंटित नहीं कर सकते हैं! यह स्मृति का अक्षम उपयोग है, क्योंकि हमें डी को स्टोर करने में सक्षम होना चाहिए था, लेकिन हम असमर्थ थे। और हम कमरे बनाने के लिए सी को स्थानांतरित नहीं कर सकते हैं, क्योंकि हमारे कार्यक्रम में कुछ चर चर सी पर इशारा कर रहे हैं, और हम इन सभी मूल्यों को स्वचालित रूप से नहीं पा सकते हैं और बदल सकते हैं।
आप कैसे जानते हैं कि यह एक समस्या है? ठीक है, सबसे बड़ा संकेत यह है कि आपके प्रोग्राम की वर्चुअल मेमोरी का आकार आपके द्वारा वास्तव में उपयोग की जाने वाली मेमोरी की तुलना में काफी बड़ा है। वास्तविक दुनिया के उदाहरण में, आपके पास मेमोरी के दस से अधिक बाइट्स होंगे, इसलिए डी को बस एक बाइट 9 शुरू करना होगा, और बाइट्स 3-5 अप्रयुक्त रहेंगे जब तक कि आपने बाद में तीन बाइट्स लंबे या छोटे कुछ आवंटित नहीं किए।
इस उदाहरण में, 3 बाइट्स बर्बाद करने के लिए पूरी तरह से नहीं है, लेकिन अधिक पैथोलॉजिकल केस पर विचार करें जहां दो जोड़े बाइट्स के दो आवंटन हैं, उदाहरण के लिए, मेमोरी में इसके अलावा दस मेगाबाइट्स, और आपको आकार 10 बिटबाइट का एक ब्लॉक आवंटित करने की आवश्यकता है + 1 बाइट। आपको दस मेगाबाइट से अधिक वर्चुअल मेमोरी के लिए ओएस से पूछने जाना होगा, भले ही आप पहले से ही पर्याप्त जगह होने से सिर्फ एक बाइट शर्म कर रहे हों।
आप इसे कैसे रोक सकते हैं? जब आप अक्सर छोटी वस्तुओं को बनाते हैं और नष्ट करते हैं, तो सबसे खराब स्थिति उत्पन्न होती है, क्योंकि इससे कई छोटे छेदों द्वारा अलग की गई कई छोटी वस्तुओं के साथ "स्विस पनीर" प्रभाव पैदा होता है, जिससे उन छिद्रों में बड़ी वस्तुओं को आवंटित करना असंभव हो जाता है। जब आप जानते हैं कि आप ऐसा करने जा रहे हैं, तो एक प्रभावी रणनीति यह है कि आप अपनी छोटी वस्तुओं के लिए पूल के रूप में मेमोरी के एक बड़े ब्लॉक को पूर्व-आबंटित करें, और फिर उस ब्लॉक के भीतर छोटी वस्तुओं के निर्माण को मैन्युअल रूप से प्रबंधित करें, बजाय डिफ़ॉल्ट आवंटनकर्ता इसे संभालता है।
सामान्य तौर पर, आप जितना कम आवंटन करते हैं, उतनी ही कम स्मृति खंडित हो जाती है। हालांकि, एसटीएल इससे प्रभावी तरीके से निपटता है। यदि आपके पास एक स्ट्रिंग है जो अपने वर्तमान आवंटन की संपूर्णता का उपयोग कर रही है और आप एक चरित्र को इसके लिए जोड़ते हैं, तो यह बस इसकी वर्तमान लंबाई के साथ फिर से आवंटित नहीं करता है, यह इसकी लंबाई को दोगुना करता है। यह "अक्सर छोटे आवंटन के लिए पूल" रणनीति पर एक भिन्नता है। स्ट्रिंग मेमोरी का एक बड़ा हिस्सा हड़प रही है ताकि वह बार-बार छोटे-छोटे वास्तविक परिवर्तनों को किए बिना आकार में बार-बार होने वाले छोटे-छोटे परिवर्तनों से कुशलता से निपट सके। वास्तव में सभी एसटीएल कंटेनर इस प्रकार का काम करते हैं, इसलिए आमतौर पर आपको एसटीएल कंटेनरों को स्वचालित रूप से वास्तविक बनाने के कारण होने वाले विखंडन के बारे में बहुत अधिक चिंता करने की आवश्यकता नहीं होगी।
हालाँकि, एसटीएल कंटेनर एक-दूसरे के बीच मेमोरी नहीं रखते हैं, इसलिए यदि आप कई छोटे कंटेनर बनाने जा रहे हैं (कुछ कंटेनरों के बजाय जो बार-बार रिसाइकिल होते हैं) तो आपको उसी तरह से विखंडन को रोकने के साथ खुद को परेशान करना पड़ सकता है किसी भी अक्सर बनाई गई छोटी वस्तुओं, एसटीएल या नहीं के लिए।