Home » Delphi » Component, Delphi, Sample Apps, Tips & Tricks » Delphi: Notification On Memory Leaks

Delphi: Notification On Memory Leaks

Print Friendly



Delphi-Memory-Leaks-NotificationKadang, 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“.

Catatan
Sample App tulisan ini dibuat di Delphi 2009 (dapat juga diinstall di D2010, XE dan XW2). untuk Delphi sebelumnya, silahkan lihat di ”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:

 

Comments

comments

Powered by Facebook Comments

One Response to Delphi: Notification On Memory Leaks

  1. kmrn jg sempet baca file berukuran besar 500 MB, tp krn lupa pke .free ama .close aplikasinya jd lek pemakaian trs meningkat

       New Post

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>