Sudah lama sejak saya mempelajari hal ini, tapi begini saja.
Ketika suatu sistem operasi meluncurkan suatu proses, itu menugaskannya halaman dari tabel kehabisan memori virtual. Sistem operasi bertanggung jawab untuk memelihara peta dari tabel memori virtual ke memori nyata atau ke ruang swap pada disk. Ketika suatu proses terbunuh, OS tidak hanya berhenti memberikannya siklus CPU. Itu melakukan beberapa item pembersihan, salah satunya adalah untuk menandai semua halaman memorinya sebagai gratis. Ini memungkinkan mereka untuk digunakan kembali oleh aplikasi lain. OS mungkin juga akan membersihkan semua sumber daya yang dimiliki proses tersebut, secara otomatis menutup file, koneksi jaringan, pipa proses-ke-proses, dan sebagainya. Proses ini sepenuhnya di bawah kendali OS, dan langkah-langkah ini akan diambil tidak peduli bagaimana prosesnya mati.
Ingatlah semua ini berlaku untuk proses sistem operasi. Jika Anda memiliki beberapa jenis mesin virtual, dan menjalankan beberapa proses virtual sekaligus, maka VM bertanggung jawab untuk memutuskan bagaimana mengalokasikan dan membatalkan alokasi untuk mereka. Dari OS, bagaimanapun, masih terlihat seperti satu proses. Jadi dalam kasus ini, jika Anda memiliki VM yang menjalankan banyak proses, dan Anda membunuh salah satunya di dalam VM, maka Anda mungkin tidak akan segera mendapatkan memori kembali di OS host. Tetapi Anda akan mendapatkannya kembali di VM. Namun, jika Anda membunuh VM di dalam sistem operasi, OS akan membunuh VM (yang secara tidak langsung membunuh proses VM) dan mendapatkan kembali semua memori (yang tidak perlu melalui pengumpul sampah, gratis () , hapus, atau yang lainnya).
Sangat spekulatif:
Jika .NET berjalan sebagai mesin virtual dengan lebih dari satu aplikasi .NET pada VM yang sama, maka .NET dapat berpegang pada memori yang belum GCd, sampai menjalankan GC, dan Windows akan berpikir bahwa .NET adalah menggunakan lebih dari yang sebenarnya. (Dan jika MS benar-benar apik, Windows kemudian dapat mengatakan .NET ke GC dalam situasi memori yang ketat, tetapi hampir tidak ada gunanya karena itulah gunanya ruang swap disk.)
Jika .NET memang bekerja seperti itu, maka OS akan tetap menganggapnya sebagai satu proses untuk tujuan OS, yang mengambil tanggung jawab untuk memutuskan apa yang harus disimpan dan apa yang harus dibuang, dan biasanya bukan masalah Windows untuk memberi tahu proses yang diperlukan. untuk memulai deallocating memory. Pada titik ini, mungkin saja MS akan membuat API khusus hanya untuk .NET sehingga proses .NET terlihat seperti proses Windows, kecuali mereka tidak, itulah sebabnya orang mungkin berpikir bahwa memori proses tidak mendapatkan alokasi ulang. Benar-benar; hanya saja Anda melihat proses yang salah.
Saya tidak cukup tahu tentang .NET untuk mengatakan bahwa itu benar-benar berfungsi seperti itu; VM Java tentu saja tidak.
Akhir dari spekulasi.
EDIT: Sejauh membunuh proses yang buruk untuk manajemen memori yang bersangkutan, yang membutuhkan beberapa proses untuk mengalokasikan keluar dari kolam yang sama (yaitu mereka lebih seperti utas daripada proses nyata) dan untuk memori tidak dibebaskan setelah proses terbunuh. Itu hampir akan membutuhkan sistem multitasking kooperatif, karena memori virtual dan multitasking pre-emptive, setahu saya, biasanya dilaksanakan bersama-sama (VM memungkinkan untuk mengisolasi proses dari satu sama lain dan menjaga mereka dari menginjak memori masing-masing). Memiliki memori virtual membuatnya sepele untuk dibersihkan setelah proses di tingkat OS; Anda cukup memindahkan semua halaman dari kumpulan proses ke kumpulan gratis.