Mencegah Kebocoran Memori di Aplikasi Windows

Platform yang Terpengaruh

Klien - Windows 7
Server - Windows Server 2008 R2

Deskripsi

Kebocoran memori adalah kelas bug di mana aplikasi gagal merilis memori ketika tidak lagi diperlukan. Seiring waktu, kebocoran memori memengaruhi performa aplikasi tertentu serta sistem operasi. Kebocoran besar dapat mengakibatkan waktu respons yang tidak dapat diterima karena halaman yang berlebihan. Akhirnya aplikasi serta bagian lain dari sistem operasi akan mengalami kegagalan.

Windows akan membebaskan semua memori yang dialokasikan oleh aplikasi pada penghentian proses, sehingga aplikasi yang berjalan singkat tidak akan memengaruhi performa sistem secara keseluruhan secara signifikan. Namun, kebocoran dalam proses jangka panjang seperti layanan atau bahkan plug-in Explorer dapat sangat memengaruhi keandalan sistem dan mungkin memaksa pengguna untuk me-reboot Windows untuk membuat sistem dapat digunakan lagi.

Aplikasi dapat mengalokasikan memori atas nama mereka dengan berbagai cara. Setiap jenis alokasi dapat mengakibatkan kebocoran jika tidak dikosongkan setelah digunakan. Berikut adalah beberapa contoh pola alokasi umum:

  • Memori heap melalui fungsi HeapAlloc atau runtime C/C++ yang setara dengan malloc atau baru
  • Alokasi langsung dari sistem operasi melalui fungsi VirtualAlloc .
  • Handel kernel yang dibuat melalui API Kernel32 seperti CreateFile, CreateEvent, atau CreateThread, menyimpan memori kernel atas nama aplikasi
  • Handel GDI dan USER yang dibuat melalui API User32 dan Gdi32 (secara default, setiap proses memiliki kuota 10.000 handel)

Praktik Terbaik

Memantau konsumsi sumber daya aplikasi Anda dari waktu ke waktu adalah langkah pertama dalam mendeteksi dan mendiagnosis kebocoran memori. Gunakan Windows Task Manager dan tambahkan kolom berikut: "Ukuran Penerapan", "Handel", "Objek Pengguna", dan "Objek GDI". Ini akan memungkinkan Anda untuk membuat garis besar untuk aplikasi Anda dan memantau penggunaan sumber daya dari waktu ke waktu.

Cuplikan layar yang memperlihatkan halaman 'Proses' di Windows Task Manager.

Alat Microsoft berikut ini menyediakan informasi yang lebih rinci dan dapat membantu mendeteksi dan mendiagnosis kebocoran untuk berbagai jenis alokasi dalam aplikasi Anda:

  • Monitor Performa dan Monitor Sumber Daya adalah bagian dari Windows 7 dan dapat memantau dan mem-graph penggunaan sumber daya dari waktu ke waktu
  • Versi terbaru Application Verifier dapat mendiagnosis kebocoran tumpukan pada Windows 7
  • UMDH, yang merupakan bagian dari Alat Debugging untuk Windows, menganalisis alokasi memori tumpukan untuk proses tertentu dan dapat membantu menemukan kebocoran dan pola penggunaan lain yang tidak biasa
  • Xperf adalah alat analisis performa canggih dengan dukungan untuk jejak alokasi timbunan
  • Heap Debug CRT melacak alokasi timbunan dan dapat membantu membangun fitur penelusuran kesalahan timbunan Anda sendiri

Praktik pengodean dan desain tertentu dapat membatasi jumlah kebocoran dalam kode Anda.

  • Gunakan penunjuk cerdas dalam kode C++ baik untuk alokasi timbunan maupun untuk sumber daya Win32 seperti HANDLE kernel. Pustaka C++ Standard menyediakan kelas auto_ptr untuk alokasi heap. Untuk jenis alokasi lainnya, Anda harus menulis kelas Anda sendiri. Pustaka ATL menyediakan serangkaian kelas yang kaya untuk manajemen sumber daya otomatis untuk objek heap dan handel kernel
  • Gunakan fitur intrinsik kompilator seperti _com_ptr_t untuk merangkum penunjuk antarmuka COM Anda menjadi "penunjuk cerdas" dan membantu penghitungan referensi. Ada kelas serupa untuk jenis data COM lainnya: _bstr_t dan _variant_t
  • Pantau penggunaan memori kode .NET Anda yang tidak biasa. Kode terkelola tidak kebal terhadap kebocoran memori. Lihat "Melacak kebocoran memori terkelola" tentang cara menemukan kebocoran GC
  • Waspadai pola kebocoran dalam kode sisi klien web. Referensi melingkar antara objek COM dan mesin pembuatan skrip seperti JScript dapat menyebabkan kebocoran besar dalam aplikasi web. "Memahami dan Memecahkan Pola Kebocoran Internet Explorer" memiliki informasi lebih lanjut tentang kebocoran semacam ini. Anda dapat menggunakan Detektor Kebocoran Memori JavaScript untuk men-debug kebocoran memori dalam kode Anda. Sementara Windows Internet Explorer 8, yang dikirim dengan Windows 7, mengurangi sebagian besar masalah ini, browser yang lebih lama masih rentan terhadap bug ini
  • Hindari menggunakan beberapa jalur keluar dari fungsi. Alokasi yang ditetapkan ke variabel pada cakupan fungsi harus dikosongkan dalam satu blok tertentu di akhir fungsi
  • Jangan gunakan pengecualian dalam kode Anda tanpa membebaskan semua variabel lokal dalam fungsi. Jika Anda menggunakan pengecualian asli, bebaskan semua alokasi Anda di dalam blok __finally. Jika Anda menggunakan pengecualian C++, semua tumpukan dan alokasi penanganan Anda perlu dibungkus dengan penunjuk cerdas
  • Jangan membuang atau menginisialisasi ulang objek PROPVARIANT tanpa memanggil fungsi PropVariantClear

Pola Alokasi Umum:

Alat Microsoft:

Tautan Tambahan: