Built-in Memory Leak Detection
Mulai versi Delphi 2006, manajemen memori yang digunakan oleh Delphi, baik untuk IDE maupun aplikasi hasil kompilasi telah menggunakan proyek open-source FastMM. Salah satu kelebihannya adalah tersedianya fasilitas deteksi memory leak.
Sabar, sebelum saya menerangkan penggunaannya, terlebih dahulu akan saya terangkan apa dan bagaimana memory-leak.
Definisi Memory Leak
Memory leak adalah suatu keadan dimana alokasi suatu blok memori tidak dibebaskan oleh pihak yang bertanggung jawab membebaskannya. Normalnya, ketika suatu aplikasi meminta sejumlah alokasi memori, pada suatu kondisi, aplikasi harus membebaskan memori yang telah dialokasikan tersebut sehingga blok memori yang tersedia dapat digunakan oleh aplikasi lainnya.
Nah kondisi apa yang membuat memori harus dibebaskan? Umumnya adalah ketika aplikasi sudah tidak menggunakan blok memori tersebut. Toleransi maksimal pembebasan alokasi memori adalah pada saat aplikasi ditutup. Pembuat aplikasi harus bertanggungjawab membebaskan blok memori yang telah dialokasikan.
Lalu mengapa memori yang digunakan harus dibebaskan? Jika memori yang dialokasikan tidak dibebaskan, maka akan mengurangi ketersedian memori yang dapat digunakan oleh sistem operasi dan aplikasi lainnya, sehingga apabila terdapat dalam jumlah yang besar, dapat mempengaruhi kinerja sistem operasi dan aplikasi lainnya. Blok memori yang tidak dibebaskan hanya bisa di peroleh kembali (di-klaim) dengan menggunakan aplikasi semacam memory cleaner atau melalui restart sistem operasi.
Memory leak murni merupakan kesalahan pembuat program yang kurang hati – hati dalam merancang / mengembangkan programnya.
Bagaimana menghasilkan memori leak?
Sebagai contoh akan saya tunjukkan konsep bagaimana menghasilkan memory leak.
Pertama, buat suatu kontrol tombol, dan berikan event pada saat tombol di klik. Pada event tersebut, deklarasikan sebuah obyek lokal. Selanjutnya pada bagian implementasi event, buat obyek lokal yang telah dideklarasikan. Pembuatan obyek ini secara tidak langsung akan meminta sejumlah alokasi blok memori.
Dengan kondisi di atas, maka akan terjadi memory leak karena obyek yang telah dibuat tersebut tidak pernah dibebaskan. Untuk lebih jelasnya simak lanjutannya mengenai implementasi konsep tersebut dengan Delphi.
Bagaimana Prakteknya ?
Bagaimana prakteknya? coba simak cuplikan kode berikut:
procedure TMainForm.btnGenerateObjectClick(Sender: TObject); var AObject : TObject; begin AObject := TObject.Create; ShowMessage('An object has been created.'); end;
Kode diatas sudah benar? Ya dan Tidak. Ya, karena kode diatas berhasil dikompilasi. Tidak, karena ketika kode tersebut dijalankan, akan menghasilkan memory leak.
Pada baris kelima, sebuah obyek lokal dari kelas TObject dialokasikan. Namun sampai dengan akhir prosedur, alokasi memori terhadap obyek tersebut tidak pernah dibebaskan, yang tentunya menghasilkan memory leak.
Deteksi Memory Leak Terintegrasi
FastMM, sebagai default memory manager dapat melaporkan adanya penggunaan memori yang tidak dibebaskan. Secara default fasilitas ini tidak diaktifkan. Dengan hanya menambahkan satu baris kode sumber saja, kita dapat mengaktifkan fasilitas ini, yaitu dengan memberikan nilai True pada variabel global ReportMemoryLeaksOnShutdown.
Laporan memory leak akan disajikan ketika aplikasi ditutup. Laporan yang dihasilkan adalah berupa rincian besaran blok memori yang dialokasikan beserta jumlah frekuensi alokasinya, misalnya TObject dialokasikan sebanyak 5 kali. Jika tidak terdeteksi memory leak, maka laporan tidak disajikan. Memang jika dibandingkan dengan produk komersial seperti EurekaLog, fasilitas ini masih kalah, tapi setidaknya kita sudah mempunyai fasilitas ini tanpa harus memasang komponen / kelas tambahan.
Bagaimana dan Dimana mengaktifkannya ?
Karena sifatnya sebagai variabel global, maka dapat dapat dipanggil dimana saja, namun untuk keseragaman dan pencegahan duplikasi, pengaturan dapat diletakkan pada file proyek seperti yang dicontohkan pada potongan kode berikut:
program BuiltInMemoryLeakDetection; uses Forms, MainUnit in 'MainUnit.pas' {MainForm}; {$R *.res} begin ReportMemoryLeaksOnShutdown := True; Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TMainForm, MainForm); Application.Run; end.
Dan jika aplikasi dijalankan, dengan menekan tombol sebanyak 5 kali, maka ketika aplikasi ditutup, akan tampak laporan memory leak seperti gambar berikut:
Semoga bermanfaat.
Thanx for the posting bro. Kira-kira ada nggak caranya agar baris yang menyebabkannya juga kereport ya? Atau tools lain?
Yang ini sudah cukup membantu sih. Just curious apa ada yang lebih canggih.
AFAIK, Report memory leak yang dihasilkan oleh FastMM4 ya sampai di situ saja, tidak bisa sampai ke nomor baris kode sumber penyebabnya.
Kalo tools lain, yang saya tahu adalah EurekaLog, bener2 dijamin puas deh, tapi yang ini komersial. Tool lainnya saya kurang begitu tau bro, kabarnya sih ada MemCheck yang free atau MemSleuth, tapi saya belum pernah mencobanya.
Oooh … gitu toh. FastMM juga bisa buat deteksi memory leaks ?.
wah kurang baca-baca nih!!!.
sekarang ini saya pake eurekalog.
tenkiu deh.
Thanx for the posting bro