Garbage Collection adalah fitur utama dari bahasa pemrograman Java yang secara otomatis mengelola alokasi dan dealokasi memori untuk objek yang dibuat di eden space.
Garbage Collection di Java memungkinkan pengembang untuk berfokus pada penulisan kode tanpa mengkhawatirkan manajemen memori, sehingga membuat Java menjadi pilihan populer untuk membangun aplikasi yang kompleks dan berskala besar. Namun, memahami cara kerja Garbage Collection sangat penting bagi pengembang Java untuk mengoptimalkan kinerja kode mereka dan menghindari kesalahan umum terkait memori.
Dalam panduan ini, dasar-dasar Garbage Collection di Java dibahas, termasuk manfaat, berbagai jenis collector, dan praktik terbaik yang harus diikuti saat melakukan pengkodean. Jadi, mari selami dan jelajahi cara kerja Garbage Collection!
Lihat analisis biaya dan manfaat dari IBM Robotic Process Automation (RPA).
Baca panduan tentang observabilitas
OutofMemoryError adalah jenis kesalahan yang terjadi ketika program atau aplikasi mencoba mengalokasikan memori lebih dari jumlah yang tersedia. Kesalahan ini terjadi ketika Java Virtual Machine (JVM) atau platform lain kehabisan memori saat mencoba menjalankan aplikasi.
OutofMemoryError biasanya terjadi saat aplikasi atau program mencoba membuat objek baru, tetapi JVM tidak dapat mengalokasikan memori untuk menampungnya. Kesalahan ini juga dapat terjadi ketika aplikasi menggunakan terlalu banyak memori dan tidak melepaskannya dengan benar.
Ketika OutOfMemoryError terjadi, aplikasi biasanya akan crash dan berhenti. Kesalahan ini biasa terjadi pada program yang menangani metadata dalam jumlah besar, seperti aplikasi pemrosesan gambar atau video, atau program yang menangani basis data yang besar.
Untuk mengatasi kesalahan ini, Anda mungkin perlu menambah jumlah memori yang tersedia untuk aplikasi atau mengoptimalkan penggunaan memori aplikasi. Hal ini dapat dilakukan dengan memodifikasi parameter JVM atau dengan menggunakan alat profiler memori untuk mengidentifikasi kebocoran memori atau penggunaan memori yang tidak efisien.
Di Java, semua objek disimpan di heap, yang merupakan bagian memori yang dicadangkan untuk alokasi objek yang dinamis. Jika suatu objek tidak lagi direferensikan oleh bagian program mana pun, objek tersebut menjadi layak untuk Garbage Collection.
Garbage collector di Java secara berkala memindai memori heap untuk menemukan objek yang tidak digunakan. Proses Garbage Collection melibatkan beberapa langkah, termasuk menandai, menyapu, dan memadatkan.
Menandai - Langkah pertama Garbage Collection melibatkan penandaan semua objek yang masih direferensikan oleh program. Hal ini dilakukan dengan memulai dengan satu set objek root, seperti variabel global, variabel lokal, dan parameter metode, dan kemudian menelusuri semua objek yang dapat dijangkau dari root tersebut. Objek yang tidak dapat dijangkau dari root dianggap memenuhi syarat untuk Garbage Collection.
Menyapu - Setelah fase menandai, garbage collector menyapu tumpukan Java untuk mengidentifikasi dan mengklaim kembali memori yang digunakan oleh objek yang tidak lagi direferensikan. Ini melibatkan dealokasi memori yang digunakan oleh objek yang tidak digunakan, dan menambahkannya kembali ke kumpulan memori bebas.
Memadatkan - Pada beberapa algoritma Garbage Collection, fase penyapuan diikuti oleh fase pemadatan, di mana memori yang digunakan oleh objek yang tersisa diatur ulang untuk meminimalkan fragmentasi. Ini melibatkan memindahkan objek lebih dekat satu sama lain dan menciptakan blok memori bebas yang berdekatan yang lebih besar.
Java virtual machine (JVM) secara otomatis melakukan Garbage Collection, sehingga programmer tidak perlu mengelola memori secara manual. Garbage collector berjalan pada utas terpisah dan biasanya beroperasi di latar belakang, sehingga tidak mempengaruhi eksekusi normal program.
Ada dua jenis utama algoritma Garbage Collection di Java: Garbage Collection Penuh dan Garbage Collection Tambahan.
Garbage Collection penuh adalah proses di mana garbage collector (bagian dari sistem waktu proses bahasa pemrograman) mencari semua memori yang digunakan oleh program dan mengumpulkan semua objek yang tidak lagi digunakan oleh program. Objek ini kemudian ditandai sebagai sampah dan memenuhi syarat untuk dihapus dari memori.
Garbage Collection penuh biasanya dilakukan oleh sistem waktu proses bahasa pemrograman yang menggunakan manajemen memori otomatis, seperti Java atau Python. Selama proses tersebut, garbage collector menghentikan eksekusi program untuk melakukan pencarian objek sampah, yang dapat mengakibatkan perlambatan sementara dalam kinerja program.
Garbage Collection penuh biasanya dipicu ketika jumlah memori yang digunakan oleh program mencapai ambang batas tertentu atau ketika program meminta blok memori baru, dan tidak ada cukup memori bebas yang tersedia. Tujuan dari Garbage Collection penuh adalah untuk mengklaim kembali memori yang tidak diperlukan oleh program, sehingga membuatnya tersedia untuk digunakan oleh bagian lain dari program atau oleh program lain yang berjalan pada mesin yang sama.
Garbage Collection Tambahan adalah jenis teknik manajemen memori yang digunakan oleh bahasa pemrograman dan lingkungan waktu proses untuk secara otomatis mengklaim kembali memori yang tidak lagi diperlukan oleh program. Hal ini dilakukan dengan mengidentifikasi objek dalam memori yang tidak digunakan, dan membebaskan memori yang ditempatinya sehingga dapat digunakan kembali oleh bagian lain dari program.
Dalam Garbage Collection tambahan, garbage collector secara berkala memindai memori program untuk mencari objek yang tidak dapat dijangkau dalam memori heap generasi muda. Alih-alih menghentikan eksekusi program selama proses pemindaian ini, garbage collector membagi proses pemindaian menjadi bagian-bagian kecil yang dapat dikelola yang disebut "increment". Pada setiap increment, garbage collector memindai sebagian memori program, mengidentifikasi objek yang tidak diperlukan, dan menandainya sebagai tersedia untuk digunakan kembali.
Dengan menggunakan increment, garbage collector dapat mengklaim kembali memori dalam potongan-potongan kecil, tanpa mengganggu eksekusi program untuk jangka waktu yang lama. Ini membantu memastikan bahwa program tetap responsif dan tidak mengalami jeda atau penundaan yang signifikan akibat proses Garbage Collection.
Namun, Garbage Collection tambahan bisa jadi kurang efisien dibandingkan dengan jenis teknik Garbage Collection lainnya, seperti Garbage Collection mark-and-sweep atau generational, karena memerlukan pemindaian memori program yang lebih sering. Selain itu, penggunaan increment dapat menyebabkan beberapa overhead ke dalam eksekusi program, karena garbage collector perlu menjaga informasi status di antara setiap increment.
Secara keseluruhan, Garbage Collection di Java menyediakan banyak manfaat yang menjadikannya alat yang bermanfaat bagi pengembang. Berikut ini adalah beberapa manfaat menggunakan Garbage Collection di Java:
Tidak ada manajemen memori manual: Dengan Garbage Collection, pengembang tidak perlu mengelola alokasi dan dealokasi memori secara manual. Artinya, programmer dapat lebih berfokus pada penulisan kode dan lebih sedikit pada pengelolaan memori, yang dapat membantu mengurangi kesalahan dan meningkatkan produktivitas.
Mencegah kebocoran memori: Garbage Collection membantu mencegah kebocoran memori, yang dapat terjadi ketika program tidak melepaskan memori yang tidak lagi diperlukan. Hal ini dapat menyebabkan program menggunakan lebih banyak memori daripada yang diperlukan, sehingga menyebabkan kinerja yang lambat, dan akhirnya crash.
Alokasi memori dinamis: Garbage Collection Java memungkinkan alokasi memori dinamis, yang berarti bahwa memori dialokasikan sesuai kebutuhan saat waktu proses. Ini membantu mencegah kesalahan alokasi memori dan dapat membuat program lebih efisien.
Kinerja yang lebih baik: Garbage Collection dapat membantu meningkatkan kinerja suatu program dengan mengurangi jumlah waktu yang dihabiskan untuk mengelola memori. Hal ini dapat menghasilkan waktu eksekusi yang lebih cepat dan program yang lebih responsif.
Optimalisasi memori: Garbage Collection dapat mengoptimalkan penggunaan memori dengan menggunakan kembali memori yang tidak digunakan oleh satu bagian program untuk bagian program lainnya. Ini dapat membantu mengurangi penggunaan memori dan meningkatkan efisiensi program secara keseluruhan.
Pengembang mendapatkan keuntungan dari kemampuan Garbage Collection di Java untuk mengelola memori secara otomatis, mencegah kebocoran memori, memungkinkan alokasi memori dinamis, meningkatkan kinerja, dan mengoptimalkan penggunaan memori, Garbage Collection dapat membantu pengembang menulis program yang lebih baik dan lebih efisien.
Di Java, Garbage Collection dipicu secara otomatis oleh JVM (Java Virtual Machine) ketika JVM menentukan bahwa tumpukan sampah mulai penuh atau ketika sejumlah waktu telah berlalu.
Ada beberapa peristiwa yang dapat memicu Garbage Collection di Java:
Alokasi ruang heap: Ketika JVM perlu mengalokasikan memori untuk objek baru, dan tidak ada cukup ruang di heap, JVM akan memicu Garbage Collection untuk mengklaim kembali memori yang tidak terpakai atau menyimpannya di survivor space.
Panggilan metode System.gc(): Anda dapat secara eksplisit meminta Garbage Collection dengan memanggil metode System.gc(), meskipun tidak ada jaminan akan berjalan.
Ambang batas generasi lama: Garbage Collection juga dapat dipicu ketika ukuran heap ruang heap generasi lama (yang menyimpan objek berumur panjang) mencapai ambang batas tertentu.
Ambang batas PermGen/Metaspace: Pada versi Java sebelum Java 8, Garbage Collection juga dapat dipicu ketika ukuran area memori PermGen (Permanent Generation) atau Metaspace (pada Java 8 dan yang lebih baru) mencapai ambang batas tertentu.
Berbasis waktu: Terkadang, Garbage Collection dapat dipicu berdasarkan interval waktu. Misalnya, JVM mungkin memicu Garbage Collection setiap jam atau setiap hari, terlepas dari penggunaan memori.
Perlu dicatat bahwa perilaku Garbage Collection yang sebenarnya di Java dapat bervariasi, tergantung pada implementasi dan konfigurasi JVM.
Untuk meminta Java Virtual Machine (JVM) menjalankan garbage collector, Anda dapat mengikuti langkah-langkah berikut:
Panggil metode System.gc(): Metode ini digunakan untuk meminta JVM menjalankan garbage collector. Tidak dijamin bahwa garbage collector akan berjalan segera setelah metode ini dipanggil.
Gunakan flag JVM -XX:+DisableExplicitGC: Flag ini menonaktifkan permintaan Garbage Collection eksplisit. Ini berarti bahwa bahkan jika Anda memanggil System.gc () atau Runtime.getRuntime().gc(), garbage collector tidak akan dipicu.
Penting untuk dicatat bahwa meminta garbage collector secara eksplisit untuk dijalankan umumnya tidak direkomendasikan, karena JVM dirancang untuk mengelola alokasi memori dan Garbage Collection secara otomatis. Permintaan Garbage Collection secara eksplisit terkadang dapat berdampak negatif pada kinerja.
Sebuah objek dalam bahasa pemrograman memenuhi syarat untuk Garbage Collection ketika objek tersebut tidak lagi direferensikan oleh bagian mana pun dari program. Garbage Collection otomatis adalah proses yang dilakukan oleh lingkungan waktu proses bahasa pemrograman untuk mengklaim kembali memori.
Dalam sebagian besar bahasa pemrograman modern, Garbage Collection dilakukan secara otomatis oleh lingkungan waktu proses. Algoritma spesifik yang digunakan untuk Garbage Collection dapat bervariasi tergantung pada bahasa pemrograman dan implementasinya, tetapi prinsip umumnya sama: lingkungan waktu proses secara berkala memindai heap (bagian memori yang digunakan untuk objek yang dialokasikan secara dinamis) untuk mengidentifikasi objek yang tidak lagi dapat dijangkau dari objek aktif mana pun dalam program. Jika suatu objek teridentifikasi tidak dapat dijangkau, objek tersebut akan ditandai sebagai sampah dan memorinya dapat diklaim kembali.
Waktu yang tepat saat sebuah objek memenuhi syarat untuk Garbage Collection bergantung pada algoritma Garbage Collection tertentu yang digunakan oleh lingkungan waktu proses. Beberapa algoritma lebih agresif daripada yang lain dan mungkin mengklaim kembali memori lebih cepat, sementara yang lain mungkin menunda Garbage Collection untuk mengoptimalkan kinerja. Namun demikian, secara umum, programmer tidak perlu khawatir tentang mengelola memori secara manual, karena lingkungan waktu proses akan menangani hal ini secara otomatis.
Ada beberapa garbage collector di java, di antaranya:
Serial Garbage Collector: Serial Collector adalah garbage collector default di Java dan biasanya digunakan dalam aplikasi kecil hingga menengah yang tidak memerlukan throughput tinggi. Jenis kolektor ini membantu mencegah peristiwa “yang menghentikan dunia” yang umum terjadi.
Parallel Garbage Collector: Parallel Collector dirancang untuk aplikasi dengan throughput tinggi dan sangat berguna dalam aplikasi yang membutuhkan heap besar karena menggunakan beberapa CPU untuk mempercepat proses. Penting untuk dicatat bahwa jenis kolektor ini membekukan thread aplikasi saat Anda menjalankan garbage collector.
Concurrent Mark Sweep (CMS) Collector: CMS Collector didesain untuk aplikasi yang memerlukan waktu jeda yang rendah dan berguna dalam aplikasi yang memiliki banyak objek live.
G1 Garbage Collector: G1 Collector dirancang untuk heap besar dan dapat menangani campuran objek berumur pendek dan panjang. G1 Collector menggunakan beberapa thread untuk memindai dan memadatkan heap secara bersamaan.
Setiap garbage collector memiliki kelebihan dan kekurangannya masing-masing, dan pilihan collector mana yang akan digunakan tergantung pada kebutuhan spesifik aplikasi. Anda juga dapat mengonfigurasi dan menyetel pengaturan garbage collector untuk mengoptimalkan kinerja untuk aplikasi tertentu.
Garbage Collection dan kebocoran memori keduanya terkait dengan manajemen memori dalam program komputer, tetapi keduanya memiliki arti dan implikasi yang berbeda.
Seperti yang dinyatakan sebelumnya, Garbage Collection biasanya dilakukan oleh bahasa pemrograman atau lingkungan waktu proses, dan ini membantu memastikan bahwa program tidak mengkonsumsi lebih banyak memori daripada yang dibutuhkan. Garbage Collection mengidentifikasi memori yang bebas digunakan oleh bagian lain dari program atau oleh program lain yang berjalan di komputer.
Di sisi lain, kebocoran memori terjadi ketika sebuah program gagal melepaskan memori yang telah dialokasikan, bahkan saat memori tersebut tidak lagi dibutuhkan. Akibatnya, program akan terus menggunakan memori, yang pada akhirnya akan menghabiskan memori yang tersedia, yang dapat menyebabkan program atau seluruh sistem operasi macet. Kebocoran memori biasanya disebabkan oleh bug dalam program, dan bisa jadi sulit untuk diidentifikasi dan diperbaiki.
Singkatnya, Garbage Collection adalah proses untuk secara otomatis membebaskan memori yang tidak lagi diperlukan. Kebocoran memori terjadi ketika memori dialokasikan tetapi tidak dilepaskan oleh program, sehingga menyebabkan penumpukan penggunaan memori secara bertahap.
Kesimpulannya, Garbage Collection adalah aspek penting dalam pemrograman Java yang memastikan manajemen memori yang efisien dengan mengklaim kembali memori yang tidak terpakai. Instana observabilitas memberi pengembang alat canggih untuk memantau dan mengoptimalkan proses Garbage Collection secara real time.
Dengan menggunakan Instana, pengembang dapat dengan cepat mengidentifikasi kebocoran memori, mengoptimalkan pengaturan Garbage Collection, dan memecahkan masalah kinerja yang terkait dengan Garbage Collection.
Dengan kemampuan pemantauan Instana yang komprehensif, pengembang dapat memperoleh insight mendalam tentang penggunaan memori dan perilaku Garbage Collection aplikasi Java mereka, sehingga memungkinkan mereka untuk menghadirkan perangkat lunak yang berkinerja tinggi dan andal.
Dengan mengikuti praktik terbaik yang diuraikan dalam panduan ini, pengembang dapat menggunakan Instana untuk mengoptimalkan proses Garbage Collection dan meningkatkan kinerja aplikasi Java mereka secara keseluruhan. Dengan observabilitas Instana, para pengembang dapat tetap terdepan dalam mengatasi masalah yang mungkin timbul, memastikan bahwa aplikasi mereka selalu berkinerja terbaik.
Observabilitas memberikan visibilitas mendalam ke dalam aplikasi terdistribusi modern untuk identifikasi dan penyelesaian masalah otomatis yang lebih cepat.
Pelajari mengapa Java tetap menjadi platform pengembangan yang populer dan bagaimana platform ini mempercepat proyek dan mendukung berbagai teknologi baru.
Pelajari hal-hal penting dalam pengembangan perangkat lunak dan bagaimana hal ini membantu bisnis berinovasi dan bersaing.
Pelajari apa yang dilakukan oleh Java Runtime Environment (JRE) dan cara kerjanya dengan komponen platform Java lainnya untuk menjalankan aplikasi Java.
Memprediksi dan mencegah masalah kinerja sebelum berdampak pada bisnis Anda dengan Application Performance Management.
Mengotomatiskan tugas-tugas operasi IT, mempercepat pengiriman perangkat lunak, dan meminimalkan risiko TI dengan rekayasa keandalan lokasi.