Bagikan melalui


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 ditoleransi karena pemanggilan 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 pendek 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 beberapa cara. Setiap jenis alokasi dapat mengakibatkan kebocoran jika tidak dibebaskan setelah digunakan. Berikut adalah beberapa contoh pola alokasi umum:

  • Memori heap melalui fungsi HeapAlloc atau setara runtime C/C++ malloc atau new
  • Alokasi langsung dari sistem operasi melalui fungsi VirtualAlloc.
  • Handel kernel yang dibuat melalui API Kernel32 seperti CreateFile, CreateEvent, atau CreateThread, tahan 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 Komit", "Handle", "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 Pengelola Tugas Windows.

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-grafik penggunaan sumber daya dari waktu ke waktu
  • Versi terbaru Application Verifier dapat mendiagnosis kebocoran memori 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 penelusuran alokasi tumpukan
  • CRT Debug Heap melacak alokasi memori heap dan dapat membantu Anda membangun fitur debug heap Anda sendiri

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

  • Gunakan pointer pintar dalam kode C++ baik untuk alokasi timbunan maupun untuk sumber daya Win32 seperti kernel HANDLEs. Pustaka Standar C++ menyediakan kelas auto_ptr untuk alokasi memori tumpukan. Untuk jenis alokasi lainnya, Anda harus menulis kelas Anda sendiri. Pustaka ATL menyediakan beragam kelas untuk manajemen sumber daya otomatis untuk objek heap dan penanganan 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 yang tidak biasa kode .NET Anda. 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 jenis kebocoran 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 bawaan, 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 objekPROPVARIANT tanpa memanggil fungsiPropVariantClear

Pola Alokasi Umum:

Peralatan Microsoft:

Tautan Tambahan: