Pengumpulan sampah tidak hanya menyingkirkan objek yang tidak direferensikan, tetapi juga memadatkan heap. Itu pengoptimalan yang sangat penting. Ini tidak hanya membuat penggunaan memori lebih efisien (tidak ada lubang yang tidak digunakan), tetapi juga membuat cache CPU jauh lebih efisien. Cache adalah masalah yang sangat besar pada prosesor modern, mereka jauh lebih cepat daripada bus memori.
Pemadatan dilakukan hanya dengan menyalin byte. Namun itu membutuhkan waktu. Semakin besar objeknya, semakin besar kemungkinan biaya untuk menyalinnya melebihi kemungkinan peningkatan penggunaan cache CPU.
Jadi mereka menjalankan banyak tolok ukur untuk menentukan titik impas. Dan mencapai 85.000 byte sebagai titik potong di mana penyalinan tidak lagi meningkatkan kinerja. Dengan pengecualian khusus untuk array ganda, mereka dianggap 'besar' ketika array memiliki lebih dari 1000 elemen. Itu adalah pengoptimalan lain untuk kode 32-bit, pengalokasi tumpukan objek besar memiliki properti khusus yang mengalokasikan memori pada alamat yang disejajarkan dengan 8, tidak seperti pengalokasi generasi biasa yang hanya mengalokasikan selaras 4. Penyelarasan itu adalah masalah besar untuk ganda , membaca atau menulis tulisan ganda yang tidak sejajar sangat mahal. Anehnya info Microsoft yang jarang tidak pernah menyebutkan array yang panjang, tidak yakin ada apa dengan itu.
Fwiw, ada banyak kecemasan programmer tentang tumpukan objek yang besar tidak dipadatkan. Ini selalu dipicu ketika mereka menulis program yang menghabiskan lebih dari setengah dari seluruh ruang alamat yang tersedia. Dilanjutkan dengan menggunakan tool seperti memory profiler untuk mencari tahu mengapa program tersebut di-bomb meskipun masih banyak tersedia virtual memory yang tidak terpakai. Alat semacam itu menunjukkan lubang di LOH, potongan memori yang tidak terpakai di mana sebelumnya ada benda besar, tetapi sampah dikumpulkan. Begitulah harga LOH yang tak terelakkan, lubang hanya dapat digunakan kembali dengan alokasi untuk benda yang ukurannya sama atau lebih kecil. Masalah sebenarnya adalah mengasumsikan bahwa program harus diizinkan untuk menggunakan semua memori virtual kapan saja.
Masalah yang jika tidak hilang sepenuhnya hanya dengan menjalankan kode pada sistem operasi 64-bit. Proses 64-bit memiliki 8 terabyte ruang alamat memori virtual yang tersedia, 3 kali lipat lebih besar dari proses 32-bit. Anda tidak bisa kehabisan lubang.
Singkat cerita, LOH membuat kode berjalan lebih efisien. Dengan biaya penggunaan ruang alamat memori virtual yang tersedia kurang efisien.
UPDATE, .NET 4.5.1 sekarang mendukung pemadatan properti LOH, GCSettings.LargeObjectHeapCompactionMode . Berhati-hatilah dengan konsekuensinya.