Selama bertahun-tahun menggunakan Windows, saya terbiasa dengan Task Manager. Dari sana, saya membunuh ratusan aplikasi karena perilaku buruk. Di sana ia menyaksikan siapa di antara mereka yang menghabiskan sumber daya. Sampai saya mulai bekerja dengan mesin yang memiliki ratusan gigabyte memori, dan aplikasi memiliki permintaan yang sesuai. Artikel ini membahas mengapa Pengelola Tugas tidak melacak memori dengan baik dan apa yang harus digunakan sebagai imbalan. Pertama, tentang mekanisme alokasi memori di Windows.
tl; dr: Manajer tugas menyembunyikan informasi tentang memori halaman dan ruang virtual proses. Lebih baik gunakan Process Explorer dari bundel Sysinternals.
Alokasi Windows
Saat memulai proses baru, OS memberikan ruang alamat terus menerus untuk proses ini. Pada sistem 32-bit, ruang ini bisa 4 GB, biasanya 2 GB untuk kernel, dan sisanya untuk proses. Artikel ini akan mengabaikan penggunaan memori inti. Pada sistem 64-bit, memori yang dipesan proses dapat tumbuh hingga 64 TB. Apa yang akan proses ini lakukan dengan beberapa terabyte memori padahal sebenarnya kita memiliki 8 GB yang menyedihkan? Pertama, Anda perlu memahami apa memori yang dicadangkan dan ditransfer.
Memori yang dicadangkan dan ditransfer
Tidak semua bagian ruang alamat yang besar ini sama. Beberapa bagian dari ruang alamat proses sebenarnya didukung oleh RAM fisik atau oleh disk (lihat di bawah). Memori yang dicadangkan dianggap Berkomitmen jika OS menawarkan memori ini kepada Anda ketika Anda mencoba menggunakannya. Sisa ruang alamat, dan ini adalah sebagian besar, tetap tersedia untuk reservasi. Artinya, OS mungkin tidak selalu menawarkan Anda blok memori ini untuk digunakan: ia dapat membuat salinan pada disk (swap file), misalnya, atau mungkin tidak. Dalam C ++, memori dicadangkan dengan memanggil
VirtualAlloc . Jadi memori yang ditransfer adalah sumber daya perangkat keras terbatas di OS. Ayo lihat.
File swap OS
File swap adalah ide bagus. Pada dasarnya, OS
memahami bahwa beberapa bagian memori tidak secara khusus digunakan oleh aplikasi Anda. Mengapa menghabiskan memori fisik nyata di atasnya? Sebagai gantinya, proses kernel menulis fragmen yang tidak digunakan ini ke disk. Sampai mereka berpaling kepadanya lagi, baru kemudian dia akan kembali ke memori.
Untuk penjelasan yang lebih rinci tentang cara kerja memori di Windows, saya merekomendasikan kuliah
"Rahasia manajemen memori" oleh Mark Russinovich.
Pelacakan memori
Ada banyak yang harus diperhatikan dan dianalisis. Siapa yang harus dihubungi? Tentu saja, ke Task Manager!
Memori RAM biasanya disebut Working Set, sedangkan semua memori yang dialokasikan biasanya disebut Private Bytes. DLL membingungkan definisi, jadi abaikan saja untuk saat ini. Dengan kata lain:
Private Bytes [ ] = +
Secara default, Task Manager menunjukkan set yang berfungsi untuk setiap proses:

Dan ini adalah angka yang saya lihat setiap saat. Bagaimana saya tahu bahwa di Task Manager informasi tentang memori yang ditransfer ada di kolom
Commit Size
. Saya tidak dapat menemukan informasi tentang memori virtual di sana.
Manajer tugas memungkinkan Anda untuk menambahkan informasi tentang memori yang ditransfer, jika Anda mengklik kanan pada kolom dan memilih item yang sesuaiMetrik Memori yang Efektif
Untungnya, ada banyak sumber daya lain untuk melacak sumber daya. PerfMon (Monitor Sistem) diinstal pada setiap mesin Windows, yang memberikan informasi yang sangat terperinci tentang setiap proses dan sistem secara keseluruhan:

Yang menarik, Monitor Sistem sebenarnya dapat memeriksa dan membandingkan metrik pada dua atau lebih komputer di jaringan. Ini adalah alat yang sangat kuat, tetapi Task Manager jelas lebih ramah pengguna. Saya merekomendasikan
Process Explorer sebagai solusi perantara:

Boom! Visual Studio, mengapa Anda masih dalam mode 32-bit (perhatikan Ukuran Virtual-nya)? Penggunaan memori puncak di komputer saya sebesar 89% dari jumlah maksimum masih dapat ditanggung. Ini akan berguna nanti.
Tambahan: banyak menunjuk ke alat mudah lainnya, termasuk
VMMap dan
RAMMap .
Debug pada informasi memori
Untungnya, ini bukan hal-hal sepele OS yang tidak perlu. Informasi aktual tentang konsumsi memori telah membantu saya berkali-kali dalam men-debug berbagai masalah.
Yang paling penting adalah menemukan bagian yang
tidak tersentuh dari memori yang dialokasikan. Tukar data juga penting: memori ini ditransfer, tetapi jarang digunakan atau tidak digunakan sama sekali.
Sekalipun ingatannya kadang-kadang digunakan, penting untuk dipahami bahwa ini adalah sumber daya yang mahal, jadi Anda tidak boleh mengikuti jalan seperti itu. Kebocoran memori akan muncul di sini.
Untuk alasan ini, saya sebelumnya mendengar saran untuk menghapus file halaman sepenuhnya dan menyamakan memori yang dialokasikan untuk set kerja. Namun, ini adalah gagasan bermata dua. Maka OS tidak dapat membuang memori jika operasi aplikasi yang salah yang kadang-kadang cadangan memori sia-sia.