Delphi: Notification On Memory Leaks
| January 8, 2012 | Posted by Joko Rivai under Component, Delphi, Sample Apps, Tips & Tricks |
Kadang, setelah kode-kode yang njelimet dan saling meng-use seperti jaring laba-laba, kita jadi bertanya, “Apakah aplikasi saya ini efisien dalam menggunakan memori? Apakah ada kebocoran memori?”
Saat melakukan debug (di Delphi), kita sebenarnya dengan mudah dapat melihat, sepanjang lifetime aplikasi kita, adakah memory leaks dan sebarapa besar jumlahnya. Delphi sudah menyiapkan fasilitas untuk itu.
Seperti tulisan dari Zarko Gajic di delphi.about.com, saya mencoba menulis ulang dalam bahasa Indonesia (bukan menyontek), menyertakan demo dan menyegarkan kembali konten tulisan saya, “Membersihkan memory leak“.
Pertama, download component TRamControl untuk Delphi:
TRamControl Component For Delphi 2009 and above (7.6 KiB)
Ekstrak file ini (7zip) ke sebuah folder, misal di C:\Delphi Components\RamControl. Kemudian dari Delphi, menu Tools>Options – di treeview klik Delphi Options>Library – Win32. Di editbox Library path, klik tombol elipsis dan di window dialog Directories, klik lagi elipsis dan pilih folder C:\Delphi Components\RamControl. Klik OK. Kembali ke window Directories, klik Add dan klik OK. Kembali ke window Options, klik OK.
Kini klik menu File>Open, buka C:\Delphi Components\RamControl\RamCtrlD12DCL.dpk dan klik Build, kemdian klik Install.
Bila sudah selesai, komponen TRamCtrl kini sudah terinstall di Delphi Anda.
Selanjutnya kita akan lihat notifikasi Delphi akan kebocoran memori (memory leak).
- Buat sebuah aplikasi baru dan tambahkan sebuah TRamCtrl, sebuah TProgressBar dan 3 TButton, 3 TEdit dan 3 TLabel. Tambahkan juga sebuah TTimer. Atur property Caption pada masing-masing buton dan label seperti gambar berikut:

- Hubungkan property ProgressBar milik RamCtrl1 ke ProgressBar1. Ini akan berguna untuk menampilkan progress pembersihan memori.
- Klik ganda Button1 (Object with Mem. Leaks). Masukkan kode berikut di event OnClick():
procedure TForm1.Button1Click(Sender: TObject); var S: TStringList; begin InformAction; s := TStringList.Create; s.Add('Tes1'); Application.Terminate; end;Potongan kod di atas akan membuat objek TStringList tanpa membebaskannya kembali dari memori. Ini akan membuat memory leak dan saat aplikasi di-terminate dari proses debug, Delphi akan menampilkan notifikasi memory leak.
- Sedangkan untuk Button2 (Object With No Mem. Leak) diisi kode berikut untuk membuat objek TStringList dan membebaskannya dari memori dengan memanggil metode Free(). Kita menggunakan juga error handler Try…Finally..End. Dengan begitu, meskipun terjadi error dalam operasi terhadap objek TStringList, memori tetap akan dibebaskan karena kode di antara Finally..dan..End tetap dijalankan.
procedure TForm1.Button2Click(Sender: TObject); var S: TStringList; begin InformAction; s := TStringList.Create; try s.Add('Tes1'); finally s.Free; end; Application.Terminate; end; - Pada kode-kode di atas, ada prosedur InformAction, yang isinya:
procedure TForm1.InformAction; begin ShowMessage('This will create an object and terminate app '#13'to show memory leaks notification.'); end; - Sedangkan Timer1 akan menampilkan informasi memori ke Edit1, Edit2 dan Edit3:
procedure TForm1.Timer1Timer(Sender: TObject); begin Edit1.Text := IntToStr(RamCtrl1.TotalPhysicalRAM div MB)+'MB'; Edit2.Text := IntToStr(RamCtrl1.PercentRAMInUse)+'%'; Edit3.Text := IntToStr(RamCtrl1.AvailablePhysRAM div MB)+'MB'; end;
Kontanta MB adalah konstanta yang dideklarasikan di unti uRam, yang nilainya adalah 1024 * 1024 bytes.
- Button3 (Cleanup RAM) akan melakukan pembersihan memori untuk membebaskan alokasi-alokasi memori yang sudah tak terpakai tapi masih tetap berada di memori, yang biasanya disebabkan oleh memory leaks. Pembersihan ini dapat juga membersihkan memori secara global, termasuk memory leaks yang disebabkan oleh aplikasi lain.
procedure TForm1.Button3Click(Sender: TObject); begin RamCtrl1.CleanUpAmount := 500 * MB; {cleans up approx. 500MB} RamCtrl1.Cleanup; end;
Harap perhatikan jumlah memory yang akan dibebaskan. Bila jumlah ini terlalu besar, akan mengakibatkan error EOutOfMemory alias memory tidak mencukupi. Untuk contoh di atas, saya jalankan di komputer dengan OS Windows 7 Home Edition dan Total RAM 2.74 GB.
Setelah selesai dengan form, kita berpindah ke Project Source. Klik menu Project>View Source. Tambahkan baris berikut:
ReportMemoryLeaksOnShutdown := DebugHook <> 0;
setelah begin sehingga menjadi:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := DebugHook <> 0;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Kode ini akan memberitahu debugger untuk menampilkan informasi kebocoran memori saat aplikasi di-terminate (debug session berakhir) apabila aplikasi dijalankan dalam mode debug dari Delphi. Informasi ini takkan tampil apabila dijalankan langsung dari command prompt atau via klik ganda di eksplorer.
Berikut source code lengkap untuk contoh kita:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, uram, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
RamCtrl1: TRamCtrl;
ProgressBar1: TProgressBar;
Button3: TButton;
Timer1: TTimer;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
procedure InformAction;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
S: TStringList;
begin
InformAction;
s := TStringList.Create;
s.Add('Tes1');
Application.Terminate;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
S: TStringList;
begin
InformAction;
s := TStringList.Create;
try
s.Add('Tes1');
finally
s.Free;
end;
Application.Terminate;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
RamCtrl1.CleanUpAmount := 500 * MB; {cleans up approx. 500MB}
RamCtrl1.Cleanup;
end;
procedure TForm1.InformAction;
begin
ShowMessage('This will create an object and terminate app '#13'to show memory leaks notification.');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.Text := IntToStr(RamCtrl1.TotalPhysicalRAM div MB)+'MB';
Edit2.Text := IntToStr(RamCtrl1.PercentRAMInUse)+'%';
Edit3.Text := IntToStr(RamCtrl1.AvailablePhysRAM div MB)+'MB';
end;
end.
Sekarang silahkan jalankan aplikasi kita dan klik masing-masing button untuk melihat efeknya. Berikut gambar untuk Button3 saat proses membersihkan memori sedang berlangsung:

Bila ingin mendownload source code untuk contoh di atas (dan contoh lainnya), silahkan langsung ke halaman download.
Delphi Memory Leaks Notification Demo (205.6 KiB)
Incoming search terms:
- notifikasi dengan delphi
- cara debugger pada delphi
- Membuat Tstringlist Delphi Create
- membuat program delphi dengan notifikasi
- free pada delphi
- error pada application mainformontaskbar true delphi
- delphi mengetahui memori usage
- code membebaskan memory pada query yang digunakan aplikasi delphi
- cara mencegah memory leak pada delphi
- cara membebaskan memori delphi
Comments
Powered by Facebook Comments









This is the default footer layout. You can easily add or remove columns in the footer.
kmrn jg sempet baca file berukuran besar 500 MB, tp krn lupa pke .free ama .close aplikasinya jd lek pemakaian trs meningkat