Pengumpul sampah (GC) adalah manajer memori. Banyak bahasa pemrograman memiliki GC bawaan. Fitur ini secara otomatis mengalokasikan dan membatalkan alokasi memori dalam suatu program. Ini melepaskan memori yang terikat dan tidak digunakan yang memperlambat aplikasi Anda.

Keindahan GC adalah ia melepaskan memori atas nama Anda, tanpa Anda perlu melakukan apa pun. Oleh karena itu, Anda mungkin menganggapnya sebagai fitur penting yang Anda harapkan setiap bahasa pemrograman memilikinya. Sayangnya, ini tidak terjadi; bahkan bahasa populer seperti C dapat kekurangan GC.

Bagaimana Alokasi Memori Bekerja?

Saat Anda menjalankan program dalam bahasa pemrograman apa pun, sistem operasi Anda mencadangkan a tumpukan data di memori untuk program itu. Program ini memiliki dan menempati tumpukan data ini sampai selesai dieksekusi. Jika program Anda membutuhkan lebih banyak memori daripada yang tersedia, program dapat secara dinamis mengalokasikan lebih banyak memori dari tumpukan memori sistem operasi.

Dalam pemrograman, variabel mewakili lokasi memori. Jadi, ketika Anda mendeklarasikan variabel baru, bahasa pemrograman mengalokasikan ruang di memori untuk variabel ini. Variabel sekarang akan memiliki alamat memori. Sampai Anda menetapkan nilai ke variabel ini, itu akan tetap tidak diinisialisasi, dan mungkin berisi beberapa nilai sampah.

Jika bahasa pemrograman memungkinkan Anda mendeklarasikan variabel tanpa menginisialisasinya, maka itu adalah variabel dinamis. Ini berarti bahwa nilai yang Anda tetapkan ke variabel mungkin berubah dari waktu ke waktu. Namun, lokasi memori variabel akan tetap sama sampai Anda membatalkan alokasinya.

Bagaimana Cara Kerja Deallokasi Memori?

Alokasi memori adalah proses yang serupa untuk semua bahasa pemrograman. Tetapi metode dealokasi memori yang sesuai cenderung berbeda. Ada dua jenis metode dealokasi memori; manual dan otomatis. GC melakukan dealokasi otomatis.

Dealokasi Memori Tanpa Pengumpul Sampah

Itu bahasa pemrograman C tidak menggunakan GC untuk dealokasi memori. Oleh karena itu, pemrogram C harus mengalokasikan dan membatalkan alokasi memori secara manual. C memungkinkan alokasi memori dinamis ketika Anda tidak tahu, pada waktu kompilasi, berapa banyak memori yang akan Anda gunakan saat run time.

Pustaka standar (stdlib.h) berisi fungsi-fungsi yang digunakan C untuk mengelola alokasi memori dinamis. Fungsi-fungsi ini meliputi:

  • malloc(): mengalokasikan ukuran memori tertentu dan mengembalikan pointer ke memori itu. Jika tidak ada cukup memori yang tersedia di kumpulan memori sistem operasi, itu mengembalikan null.
  • free(): membatalkan alokasi blok memori tertentu dan mengembalikannya ke kumpulan memori sistem operasi.

Contoh Program C

#termasuk
#termasuk

ke dalamutama()
{
ke dalam *ptr; //deklarasikan pointer
ke dalam j; // nyatakan penghitung

// mengalokasikan ruang untuk 200 bilangan bulat
ptr = (ke dalam *) malloc(200 * ukuran dari(ke dalam));

// masukkan nilai integer ke dalam memori yang dialokasikan
// dan cetak setiap nilai ke konsol
untuk (j = 0; j < 200; j++)
{
ptr[j] = j;
printf("%d\t",ptr[j]);
}

// membatalkan alokasi memori yang dialokasikan sebelumnya
Gratis(ptr);
kembali0;
}

Kode di atas mengalokasikan memori untuk menyimpan 200 nilai integer menggunakan mallok() fungsi. Ia menggunakan pointer untuk mengakses lokasi memori ini dan menyimpan 200 nilai integer di dalamnya. Pointer juga mencetak data yang disimpan di lokasi memori ke konsol. Akhirnya, program membatalkan alokasi memori yang dialokasikan sebelumnya menggunakan Gratis() fungsi.

Deallokasi Memori Dengan Pengumpul Sampah

Beberapa bahasa pemrograman populer menggunakan GC untuk manajemen memori. Hal ini membuat hidup programmer yang menggunakan bahasa-bahasa ini jauh lebih mudah. C# dan Java adalah dua bahasa pemrograman yang menggunakan GC.

C#GC

Dalam bahasa pemrograman C#, GC mengelola alokasi dan dealokasi alamat memori. Oleh karena itu, seorang pemrogram C# tidak perlu khawatir untuk membatalkan alokasi suatu objek setelah objek tersebut menyelesaikan tujuannya.

C# GC menginisialisasi kumpulan memori, yang disebut tumpukan terkelola, untuk setiap proses (atau program) baru. Ini memanggil Alokasi Virtual() berfungsi untuk mengalokasikan memori dan VirtualBebas() berfungsi untuk membatalkan alokasinya. Bagian terbaiknya adalah bahwa ini semua terjadi di latar belakang tanpa usaha yang diperlukan dari Anda, sang programmer.

C# GC memiliki mesin pengoptimal, yang digunakannya untuk memutuskan kapan harus membatalkan alokasi memori. Mesin pengoptimalan memeriksa root aplikasi untuk menentukan objek mana yang tidak lagi digunakan. Ini dilakukan dengan membuat grafik yang memanjang dari akar aplikasi ke objek yang terhubung. Akar ini mencakup bidang statis, variabel lokal, dll. Objek apa pun yang tidak terhubung ke root aplikasi adalah sampah.

Mesin pengoptimal GC tidak hanya mengumpulkan memori sendiri. Pertama-tama harus ada permintaan alokasi memori baru. Jika sistem memiliki jumlah memori yang tersedia rendah, maka mesin pengoptimal GC akan ikut bermain.

GC Jawa

Di Jawa, GC juga mengelola alokasi dan dealokasi alamat memori. Namun, Java saat ini memiliki empat jenis pengumpul sampah yang didukung:

  • Sampah-Pertama (G1)
  • Serial
  • Paralel
  • Z Pengumpul Sampah (ZGC)

Pengumpul sampah G1 adalah GC default Java sejak rilis Java Development Kit (JDK) 9. Java mengatur data dalam objek dan menyimpan objek ini dalam tumpukan ukuran tetap. Pengumpul sampah G1 membagi tumpukan menjadi wilayah tumpukan berukuran sama. Kemudian membagi wilayah tumpukan ini menjadi dua bagian; generasi muda dan tua.

Setiap kali Anda membuat objek baru, alokasi ruang untuk objek ini terjadi pada generasi muda. Menggunakan proses penuaan, pengumpul sampah G1 menyalin objek di wilayah muda ke wilayah lama. Itu juga menyalin objek yang sudah ada di wilayah lama ke wilayah yang lebih lama.

Pengumpul sampah G1 kemudian melakukan sebagian besar dealokasi memori pada generasi muda, kadang-kadang menjelajah ke bagian generasi lama.

Apa Manfaat Memiliki Pengumpul Sampah?

Manfaat memiliki pengumpul sampah adalah mencegah Anda memikirkan manajemen memori saat menulis kode Anda. Ini memberi Anda waktu untuk fokus pada aspek penting lainnya dari aplikasi Anda. Namun, beberapa manfaat lain patut disorot.

Mengklaim kembali objek yang tidak digunakan dan membebaskan memori memberikan eksekusi aplikasi yang lebih bersih. Jika program Anda mengosongkan memori sesegera mungkin, itu akan memiliki jejak memori yang lebih kecil dan dapat berjalan lebih efisien.

Pengumpulan sampah mengurangi kesalahan yang terkait dengan manajemen memori seperti kebocoran dan kesalahan penunjuk. Ini karena prosesnya tidak lagi bergantung pada programmer dan kemampuan mereka untuk menulis kode yang akurat.