Saya mencoba menggunakan utilitas perfmon windows untuk men-debug kebocoran memori dalam suatu proses.
Beginilah cara perfmon menjelaskan persyaratan:
Working Set adalah ukuran saat ini, dalam byte, dari Working Set dari proses ini. Set Kerja adalah set halaman memori yang baru-baru ini disentuh oleh utas dalam proses. Jika memori bebas di komputer berada di atas ambang batas, halaman dibiarkan dalam Perangkat Kerja dari suatu proses bahkan jika mereka tidak digunakan. Ketika memori bebas jatuh di bawah ambang batas, halaman dipangkas dari Perangkat Kerja. Jika mereka diperlukan, mereka kemudian akan kesalahan-lunak kembali ke Perangkat Kerja sebelum meninggalkan memori utama.
Virtual Bytes adalah ukuran saat ini, dalam byte, dari ruang alamat virtual yang digunakan oleh proses. Penggunaan ruang alamat virtual tidak selalu menyiratkan penggunaan yang sesuai dari disk atau halaman memori utama. Ruang virtual terbatas, dan prosesnya dapat membatasi kemampuannya untuk memuat perpustakaan.
Private Bytes adalah ukuran saat ini, dalam byte, dari memori yang telah dialokasikan proses ini yang tidak dapat dibagi dengan proses lain.
Ini adalah pertanyaan yang saya miliki:
Apakah Private Bytes yang harus saya ukur untuk memastikan apakah prosesnya mengalami kebocoran karena tidak melibatkan pustaka bersama dan kebocoran, jika terjadi, akan berasal dari proses itu sendiri?
Berapa total memori yang dikonsumsi oleh proses? Apakah ini Virtual Bytes atau jumlah dari Virtual Bytes dan Working Set?
Apakah ada hubungan antara Private Bytes, Working Set dan Virtual Bytes?
Apakah ada alat lain yang memberikan ide yang lebih baik tentang penggunaan memori?
Jawaban:
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:
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.
sumber
Anda tidak boleh mencoba menggunakan perfmon, task manager atau alat apa pun seperti itu untuk menentukan kebocoran memori. Mereka baik untuk mengidentifikasi tren, tetapi tidak banyak yang lain. Angka-angka yang mereka laporkan secara absolut terlalu kabur dan digabungkan untuk berguna untuk tugas tertentu seperti deteksi kebocoran memori.
Balasan sebelumnya untuk pertanyaan ini telah memberikan penjelasan yang bagus tentang berbagai jenisnya.
Anda bertanya tentang rekomendasi alat: Saya merekomendasikan Memory Validator. Mampu memonitor aplikasi yang membuat milyaran alokasi memori.
http://www.softwareverify.com/cpp/memory/index.html
Penafian: Saya merancang Memory Validator.
sumber
Definisi penghitung perfmon telah rusak sejak awal dan karena alasan tertentu tampaknya terlalu sulit untuk diperbaiki.
Tinjauan umum manajemen memori Windows tersedia dalam video " Misteri Manajemen Memori Terungkap " di MSDN: Ini mencakup lebih banyak topik daripada yang dibutuhkan untuk melacak kebocoran memori (misalnya manajemen pengaturan kerja) tetapi memberikan detail yang cukup dalam topik yang relevan.
Untuk memberi Anda sedikit masalah dengan deskripsi penghitung perfmon, berikut adalah kisah orang dalam tentang byte pribadi dari " Penghitung Kinerja Private Bytes - Waspadalah! " Di MSDN:
Dari " Perencanaan Kinerja " di MSDN:
sumber
Ada diskusi yang menarik di sini: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Pemahaman saya tentang utas ini adalah membebaskan alokasi kecil adalah tidak tercermin dalam Private Bytes atau Working Set.
Singkat cerita:
jika saya menelepon
maka Private Bytes hanya mencerminkan alokasi, bukan alokasi.
jika saya menelepon
maka Private Bytes mencerminkan alokasi dan deallokasi dengan benar.
sumber