Ini yang berhasil saya ketahui tentang GC (dengan bantuan Teropong Google):Garbage Collection (GC) adalah bentuk manajemen memory secara otomatis, di mana GC berusaha untuk membebaskan memory yang ditempati oleh sebuah "object yang tidak dipakai" (garbage), agar area memori tersebut bisa digunakan kembali.
APAKAH GARBAGE ITU?Garbage adalah, satu atau lebih, blok area di memory yang semula digunakan oleh program, namun setelah proses selesai, area tersebut tidak lagi dipakai. Blok memory yang dipakai oleh program itu tadinya bisa berujud dalam berbagai bentuk. Bisa berupa class, bisa berupa gambar, bisa array, bisa berupa string, bisa berupa cache file yang dibuat secara manual, ataupun bentuk-bentuk lainnya. Berbagai object tersebut akan dipakai, dan setelah jangka waktu tertentu object tersebut pasti tidak dipakai lagi. Namun adakalanya program gagal melakukan pembebasan memori pada lokasi yang tidak lagi digunakan, sehingga menjadi Garbage yang berpotensi menghabiskan memory.
Jadi, Garbage adalah blok memory yang berisi data-data (berupa byte dan bit) yang sudah tidak dipakai lagi, tetapi tidak dibebaskan, sehingga dianggap masih digunakan, padahal sudah tidak digunakan lagi.
BAGAIMANA GARBAGE TIMBUL?Garbage timbul dari pemakaian memory yang gagal dibebaskan setelah selesai digunakan. Berbagai penyebab gagalnya pembebasan, di antaranya:
- Disebabkan ketidak sengajaan/ketidak tahuan, misalnya: 1. Ketika sebuah form memanggil sebuah class, dan ketika form tersebut di tutup, lupa untuk menghancurkan class (dengan syntax "Set SuatuClass = Nothing"). Atau perintah "Set SuatuClass = Nothing" tidak pernah ter eksekusi dengan baik saat form ditutup.
2. Sebuah program membuka sebuah file, namun tidak menutup file tersebut ketika exit (mungkin karena crash, hang, atau memang masih uji coba dan lupa tulis koding untuk menutupnya).
3. Handle suatu object yang belum dibebaskan kembali ke system. Biasanya terjadi kalau memakai Windows API untuk menangani sebuah object tertentu, ataupun untuk baca-tulis.
- Disebabkan by design (dari sananya sudah begitu), misalnya: 1. Sebuah Program memanggil pustaka dari sebuah file DLL (atau OCX, atau yang lainnya), yang mana file DLL tersebut mengalokasikan memory untuk suatu keperluan. Namun DLL tersebut tidak membebaskan memory dengan baik.
2. Memanggil sebuah fungsi secara rekursif, yang di dalam fungsi tersebut menginisialisasi sebuah class atau object baru. Garbage Collection secara manual dari fungsi rekursif cukup sulit dilakukan, sehingga sebaiknya menghindari membuat fungsi rekursif yang menginisialisasi object/class baru (
pengalaman pribadi).
FASILITAS GCBeberapa kompiler menyediakan GC otomatis, beberapa masih manual, dan ada juga yang gabungan otomatis + manual.
.NET sudah menyediakan GC otomatis, yang selalu diperbaiki setiap cersi terbarunya. Bahasa pemrograman jaman dahulu masih melakukan GC secara manual (misalnya Borland C versi 1.0 for DOS). Kompiler C/C++ sekarang ini menyediakan GC otomatis, namun juga membolehkan programmer melakukan GC manual. VB6 melakukan GC otomatis + manual, namun melalui pendekatan yang berbeda, yaitu dengan menggunakan property "count" pada class object. Saat count menjadi nol, berarti tidak ada yang di referensi, dan di asumsikan memory sudah terbebaskan.
GC: VB6 DAN .NETVB6 dibangun di atas COM (Componen Object Model). Dalam COM, dalam setiap object terdapat property 'count' yang tujuannya menghitung jumlah object dalam suatu kumpulan. Ketika dideklarasikan object baru, maka 'count' akan bertambah, dan ketika object di hancurkan, dengan "Set x = Nothing", maka jumlah 'count' diturunkan, sampai menjadi nol jika semua sudah di habiskan.
Sedangkan pada .NET, GC dilakukan dengan mengumpulkan daftar alamat memory object yang ditunjuk oleh pointer. Runtime akan secara simultan memantau daftar alamat memory ini, dan pada suatu ketika akan memutuskan untuk melepas referensinya.
Dalam VB6, GC dapat dipaksa dilakukan dengan "Set X = Nothing"
Contohnya, dalam sebuah form VB6:
- Code: Select all
Private Sub BebaskanMemori()
Set X = Nothing
DoEvents ' Agar system diberi kesempatan benar-benar membebaskan memory
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
BebaskanMemori
End Sub
.NET sudah menyempurnakan GC. Namun demikian fasilitas GC manual tidak dihilangkan oleh .NET. Programmer bisa dengan leluasa melakukan GC sendiri (manual) ataupun membiarkan .NET yang melakukan GC.
Demikian yang saya tau.
Mohon dibetulkan kalau ada yang salah, ditambahkan kalau ada yang kurang
