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 penomor 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 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 agar sistem dapat digunakan lagi.
Aplikasi dapat mengalokasikan memori atas nama mereka dengan beberapa cara. Setiap jenis alokasi dapat mengakibatkan kebocoran jika tidak dibebaskan setelah digunakan. Berikut adalah beberapa contoh pola alokasi umum:
- Tumpukan memori melalui fungsi HeapAlloc atau runtime C/C++ 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.
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 membuat grafik penggunaan sumber daya dari waktu ke waktu
- Versi terbaru Pemverifikasi Aplikasi dapat mendiagnosis kebocoran timbunan 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
- CRT Debug Heap melacak alokasi heap dan dapat membantu membangun fitur debugging timbunan Anda sendiri
Praktik pengodean dan desain tertentu dapat membatasi jumlah kebocoran dalam kode Anda.
- Gunakan pointer pintar dalam kode C++ baik untuk alokasi tumpukan maupun untuk sumber daya Win32 seperti HANDLE kernel s. Pustaka Standar C++ menyediakan kelas auto_ptr untuk alokasi timbunan. Untuk jenis alokasi lainnya, Anda harus menulis kelas Anda sendiri. Pustaka ATL menyediakan serangkaian kelas yang kaya untuk manajemen sumber daya otomatis untuk objek tumpukan dan handel kernel
- Gunakan fitur intrinsik pengkompilasi seperti _com_ptr_t untuk merangkum pointer antarmuka COM Anda ke dalam "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 dibebaskan 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 handel Anda perlu dibungkus dengan penunjuk cerdas
- Jangan membuang atau menginisialisasi ulang objek PROPVARIANT tanpa memanggil fungsi PropVariantClear
Tautan ke Sumber Daya
Pola Alokasi Umum:
- Fungsi Alokasi Timbunan
- Fungsi Alokasi Memori
- Operator Baru (C++)
- Fungsi Alokasi Virtual
- Objek Kernel
- Gagang Objek GDI
- Handel Objek Antarmuka Pengguna
Alat Microsoft:
- Pemverifikasi Aplikasi
- Alat Debugging untuk Windows
- Timbunan Cadangan Mode Pengguna
- Alat Penangkapan, Pemrosesan, dan Analisis Jejak
- Timbunan Debug CRT
Tautan Tambahan:
- Kelas auto_ptr
- Kelas Memori Pustaka Templat Aktif (ATL)
- Objek _com_ptr_t
- Kelas _bstr_t
- Kelas _variant_yt
- "Melacak kebocoran memori terkelola"
- "Memahami dan Memecahkan Pola Kebocoran Internet Explorer"
- "Detektor Kebocoran Memori JavaScript"
- Mitigasi Kebocoran Memori Melingkar (di browser):
- try-finally statement
- Struktur PROPVARIANT
- Fungsi PropVariantClear