Jawaban singkat untuk pertanyaan ini adalah bahwa tidak satu pun dari nilai-nilai ini merupakan indikator yang dapat diandalkan berapa banyak memori yang dapat dieksekusi sebenarnya, dan tidak ada yang benar-benar sesuai untuk men-debug kebocoran memori.
Private Bytes merujuk pada jumlah memori yang diminta oleh proses yang dapat dieksekusi - belum tentu jumlah yang sebenarnya digunakan . Mereka "pribadi" karena mereka (biasanya) mengecualikan file yang dipetakan memori (yaitu DLL bersama). Tapi - inilah intinya - mereka tidak selalu mengecualikan memori yang dialokasikan oleh file-file itu . Tidak ada cara untuk mengetahui apakah perubahan byte pribadi disebabkan oleh executable itu sendiri, atau karena pustaka tertaut. Bytes pribadi juga bukan hanya memori fisik; mereka dapat dipetakan ke disk atau dalam daftar halaman siaga (yaitu tidak lagi digunakan, tetapi belum juga halaman).
Working Set mengacu pada total memori fisik (RAM) yang digunakan oleh proses. Namun, tidak seperti byte pribadi, ini juga termasuk file yang dipetakan memori dan berbagai sumber daya lainnya, jadi ini bahkan pengukuran yang kurang akurat daripada byte pribadi. Ini adalah nilai yang sama dengan yang dilaporkan dalam "Mem Penggunaan" oleh Task Manager dan telah menjadi sumber kebingungan yang tak berkesudahan dalam beberapa tahun terakhir. Memori dalam Perangkat Kerja adalah "fisik" dalam arti bahwa itu dapat diatasi tanpa kesalahan halaman; namun, daftar halaman siaga juga masih secara fisik berada dalam memori tetapi tidak dilaporkan dalam Perangkat Kerja, dan inilah sebabnya Anda mungkin melihat "Mem Penggunaan" tiba-tiba turun ketika Anda meminimalkan suatu aplikasi.
Virtual Bytes adalah total ruang alamat virtual yang digunakan oleh seluruh proses. Ini seperti set yang berfungsi, dalam arti bahwa itu termasuk file yang dipetakan memori (DLL bersama), tetapi juga termasuk data dalam daftar siaga dan data yang telah paged keluar dan duduk di file halaman pada disk di suatu tempat. Total byte virtual yang digunakan oleh setiap proses pada suatu sistem di bawah beban berat akan menambah hingga secara signifikan lebih banyak memori daripada mesin sebenarnya.
Jadi hubungannya adalah:
- Bytes Pribadi adalah apa yang sebenarnya dialokasikan aplikasi Anda, tetapi sertakan penggunaan pagefile;
- Working Set adalah Private Bytes yang non-paged plus file yang dipetakan dengan memori;
- Bytes Virtual adalah Set Kerja plus byte Pribadi dan daftar siaga.
Ada masalah lain di sini; sama seperti pustaka bersama dapat mengalokasikan memori di dalam modul aplikasi Anda, yang mengarah ke potensi kesalahan positif yang dilaporkan dalam Private Bytes aplikasi Anda , aplikasi Anda mungkin juga akhirnya mengalokasikan memori di dalam modul bersama , yang mengarah ke negatif palsu . Itu berarti sebenarnya mungkin bagi aplikasi Anda untuk memiliki kebocoran memori yang tidak pernah memanifestasikan dirinya dalam Private Bytes sama sekali. Tidak mungkin, tetapi mungkin.
Private Bytes adalah perkiraan yang masuk akal dari jumlah memori yang dapat dieksekusi yang Anda gunakan dan dapat digunakan untuk membantu mempersempit daftar kandidat potensial untuk kebocoran memori; jika Anda melihat jumlahnya terus bertambah dan terus-menerus dan tanpa akhir, Anda ingin memeriksa prosesnya apakah ada kebocoran. Namun, ini tidak dapat membuktikan bahwa ada kebocoran atau tidak.
Salah satu alat paling efektif untuk mendeteksi / memperbaiki kebocoran memori di Windows sebenarnya adalah Visual Studio (tautan menuju halaman tentang menggunakan VS untuk kebocoran memori, bukan halaman produk). Purifikasi Rasional adalah kemungkinan lain. Microsoft juga memiliki dokumen praktik terbaik yang lebih umum tentang hal ini. Ada lebih banyak alat yang tercantum dalam pertanyaan sebelumnya ini .
Saya harap ini membersihkan beberapa hal! Melacak kebocoran memori adalah salah satu hal paling sulit dilakukan dalam debugging. Semoga berhasil.