एक कचरा संग्रह सिर्फ अपरिचित वस्तुओं से छुटकारा नहीं देता है, यह ढेर को भी कॉम्पैक्ट करता है। यह एक बहुत ही महत्वपूर्ण अनुकूलन है। यह सिर्फ मेमोरी उपयोग को अधिक कुशल नहीं बनाता है (न अप्रयुक्त छेद), यह सीपीयू कैश को अधिक कुशल बनाता है। कैश आधुनिक प्रोसेसर पर एक बहुत बड़ी बात है, वे मेमोरी बस की तुलना में तेजी से परिमाण का एक आसान क्रम हैं।
कॉम्पैक्टिंग बस बाइट्स को कॉपी करके किया जाता है। हालांकि इसमें समय लगता है। बड़ी वस्तु, अधिक संभावना है कि इसे कॉपी करने की लागत संभव सीपीयू कैश उपयोग में सुधार से आगे निकल जाती है।
इसलिए उन्होंने ब्रेक-सम पॉइंट को निर्धारित करने के लिए बेंचमार्क का एक समूह चलाया। और कटऑफ पॉइंट के रूप में 85,000 बाइट्स पर पहुंचे जहां कॉपी करने से अब सुधार नहीं होता है। डबल के सरणियों के लिए एक विशेष अपवाद के साथ, उन्हें 'बड़ा' माना जाता है जब सरणी में 1000 से अधिक तत्व होते हैं। यह 32-बिट कोड के लिए एक और अनुकूलन है, बड़े ऑब्जेक्ट हीप एलोकेटर की विशेष संपत्ति है कि यह उन पते पर मेमोरी आवंटित करता है जो 8 से संरेखित होते हैं, जो कि नियमित रूप से उत्पन्न होने वाले आवंटन के विपरीत आवंटित होता है जो केवल 4 से जुड़ा हुआ है। यह संरेखण दोगुने के लिए एक बड़ी बात है। एक गलत संरेखित डबल पढ़ना या लिखना बहुत महंगा है। विचित्र रूप से विरल Microsoft जानकारी में लंबे समय के सरणियों का उल्लेख नहीं है, निश्चित नहीं है कि उसके साथ क्या हो रहा है।
Fwiw, बड़े ऑब्जेक्ट हीप को संकुचित न होने के बारे में बहुत सारे प्रोग्रामर को गुस्सा है। यह हमेशा के लिए शुरू हो जाता है जब वे ऐसे प्रोग्राम लिखते हैं जो पूरे उपलब्ध पते के आधे से अधिक हिस्से का उपभोग करते हैं। एक मेमोरी प्रोफाइलर जैसे टूल का उपयोग करके यह पता लगाने के लिए कि कार्यक्रम में बमबारी क्यों हुई, हालांकि अभी भी बहुत सारी अप्रयुक्त आभासी मेमोरी उपलब्ध थी। इस तरह के एक उपकरण में LOH में छेद दिखाई देता है, स्मृति के अप्रयुक्त विखंडू जहां पहले एक बड़ी वस्तु रहती थी लेकिन कचरा एकत्र हो गया। LOH की ऐसी अपरिहार्य कीमत है, छेद को केवल एक वस्तु के लिए आवंटन द्वारा फिर से उपयोग किया जा सकता है जो आकार में बराबर या छोटा है। वास्तविक समस्या यह मान रही है कि किसी भी कार्यक्रम को किसी भी समय सभी वर्चुअल मेमोरी का उपभोग करने की अनुमति दी जानी चाहिए ।
एक समस्या जो अन्यथा 64-बिट ऑपरेटिंग सिस्टम पर कोड चलाने से पूरी तरह से गायब हो जाती है। 64-बिट प्रक्रिया में वर्चुअल मेमोरी एड्रेस स्पेस के 8 टेराबाइट्स उपलब्ध हैं, 32-बिट प्रक्रिया से अधिक 3 ऑर्डर। आप सिर्फ छेद से बाहर नहीं भाग सकते।
लंबी कहानी छोटी, LOH कोड को अधिक कुशल बनाता है। उपलब्ध वर्चुअल मेमोरी एड्रेस स्पेस कम कुशल उपयोग करने की कीमत पर।
अद्यतन, .NET 4.5.1 अब LOH, GCSettings.LargeObjectHeapCompaction.od संपत्ति को संकुचित करने का समर्थन करता है । कृपया परिणामों से सावधान रहें।