Home > Delphi, Did You Know > Built-in Memory Leak Detection

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:

Deteksi Memory Leak

Deteksi Memory Leak

Semoga bermanfaat.

Advertisements
  1. October 7, 2008 at 2:50 pm

    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.

  2. October 7, 2008 at 3:44 pm

    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.

  3. herux
    January 16, 2009 at 11:08 am

    Oooh … gitu toh. FastMM juga bisa buat deteksi memory leaks ?.
    wah kurang baca-baca nih!!!.
    sekarang ini saya pake eurekalog.

    tenkiu deh.

  4. August 30, 2010 at 12:25 pm

    Thanx for the posting bro

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: