Java - Pengumpulan Rakit

Halo di sana, ahli penyihir Java masa depan! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia Pengumpulan Rakit Java. Jangan khawatir jika anda baru di atas pemrograman – saya akan menjadi pemandu anda yang mesra, dan kita akan menjelajahi topik ini langkah demi langkah. Jadi, rakitkan rakit virtual anda, dan mari kita bersihkan beberapa memori!

Java - Garbage Collection

Apa itu Pengumpulan Rakit Java?

Bayangkan anda di atas perayaan yang tidak pernah berakhir (iya, keren kan?). Apabila orang-orang menikmati diri mereka, mereka meninggalkan rakit kosong dan piring di mana-mana. Di atas perayaan biasa, anda harus membersihkan secara manual. Tetapi apa jika ada sistem pembersihan yang magis yang secara otomatis menghapuskan rakit tanpa anda sadar? Itu hampir sama dengan apa yang Pengumpulan Rakit Java lakukan untuk program anda!

Dalam istilah pemrograman, Pengumpulan Rakit (GC) adalah sistem pengurusan memori otomatis. Ia mengenalpasti objek di atas program Java yang tidak lagi diperlukan dan menghapuskan mereka untuk membebaskan memori. Proses ini terjadi di belakang layar, membolehkan pengembang untuk fokuskan pada penulisan kod daripada pengurusan memori secara manual.

Mari lihat contoh yang simple:

public class ContohPengumpulanRakit {
public static void main(String[] args) {
// Buat objek baru
String nama = new String("John Doe");

// Variabel 'nama' sekarang menunjuk kepada null
nama = null;

// Pada masa ini, objek String asal "John Doe"
// layak untuk pengumpulan rakit

// Menyarankan untuk menjalankan pengumpulan rakit (tidak dijamin)
System.gc();
}
}

Dalam contoh ini, kita membuat objek String "John Doe" dan menetapkannya ke variabel 'nama'. Apabila kita menetapkan 'nama' kepada null, objek String asal menjadi tidak dapat dijangkau. Pengumpul Rakit akan akhirnya membersihkan objek ini, membebaskan memori yang ia pergunakan.

jenis Pengumpul Rakit

Java menawarkan beberapa jenis pengumpul rakit, masing-masing dengan kekuatan mereka sendiri. Itu seperti memiliki beberapa jenis rakit penyedia untuk situasi yang berbeza. Mari kita berkenalan dengan rakit penyedia kita:

  1. Pengumpul Rakit Serial
  2. Pengumpul Rakit Paralel
  3. Pengumpul Rakit Concurrent Mark Sweep (CMS)
  4. Pengumpul Rakit G1

Berikut adalah rakit penyedia yang ringkas mengenai pengumpul ini:

Pengumpul Rakit Terbaik Untuk Fitur Utama
Serial GC Lingkungan single-threaded, set data kecil Sederhana dan efisien untuk aplikasi kecil
Parallel GC Lingkungan multi-threaded, set data besar Fokus kepada kelajuan
CMS GC Aplikasi yang memerlukan waktu jeda rendah Operasi konurrent untuk mengurangkan jeda
G1 GC Ukuran rakit besar, waktu jeda yang dapat diprediksi Membahagikan rakit menjadi wilayah untuk pengumpulan yang efisien

Generasi dalam Pengumpulan Rakit

Sekarang, mari kita bercakap tentang bagaimana Java menguruskan objek untuk pengumpulan rakit. Java menggunakan model pengumpulan rakit generasi, yang berdasarkan pada pengamatan bahwa sebagian besar objek memiliki masa hayat yang pendek.

Rakit (tempat tinggal objek) dibahagikan menjadi tiga generasi:

  1. Generasi Muda
  2. Generasi Tua (juga dipanggil Generasi Berusia)
  3. Generasi Permanen (diganti oleh Metaspace di atas Java 8+)

Berikut adalah cara untuk berfikir tentangnya: Bayangkan kota dengan tiga lingkungan - Youngstown, Oldville, dan Permanentburg.

Generasi Muda (Youngstown)

Ini adalah tempat objek baru lahir. Ini adalah tempat yang sibuk dan dinamis dengan kadar pusingan tinggi. Sebagian besar objek tinggal dan mati di sini tanpa pernah pindah ke area lain.

Generasi Muda lebih lanjut dibahagikan menjadi tiga ruang:

  • Ruang Eden: Tempat objek baru dialokasikan.
  • Survivor Space 0 dan Survivor Space 1: Tempat objek yang bertahan di atas pengumpulan rakit dipindahkan.

Mari lihat contoh pembentukan objek di atas Generasi Muda:

public class ContohGenerasiMuda {
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
// Objek ini diciptakan di atas Ruang Eden
Object obj = new Object();
}
// Sebagian besar objek ini akan dikumpulkan di atas Minor GC berikutnya
}
}

Dalam contoh ini, kita membuat 1000 objek. Ini akan awalnya dialokasikan di atas Ruang Eden Generasi Muda.

Generasi Tua (Oldville)

Objek yang bertahan di atas beberapa pengumpulan rakit di atas Generasi Muda dipromosikan ke Generasi Tua. Itu seperti komuniti penyaraan untuk objek yang berumur panjang.

Berikut adalah contoh objek yang mungkin berada di atas Generasi Tua:

public class ContohGenerasiTua {
private static final ArrayList<String> longLivedList = new ArrayList<>();

public static void main(String[] args) {
for (int i = 0; i < 100000; i++) {
longLivedList.add("Item " + i);
// Daftar ini kemungkinan besar akan dipromosikan ke Generasi Tua
// karena ia tumbuh dan bertahan di atas beberapa siklus GC
}
}
}

Dalam kasus ini, longLivedList kemungkinan besar akan dipromosikan ke Generasi Tua karena ia tumbuh dan bertahan di atas beberapa siklus pengumpulan rakit.

Minor Pengumpulan Rakit

Minor GC adalah seperti pembersihan cepat di atas Youngstown. Ini cepat dan terjadi secara kerap. Apabila Generasi Muda penuh, Minor GC akan berfungsi untuk membersihkan itu.

Berikut adalah apa yang terjadi semasa Minor GC:

  1. Semua objek di Eden dipindahkan ke salah satu Ruang Survivor.
  2. Objek dari Ruang Survivor saat ini dipindahkan ke Ruang Survivor lain.
  3. Objek yang telah bertahan beberapa Minor GC dipromosikan ke Generasi Tua.

Full Pengumpulan Rakit

Full GC adalah pembersihan yang lebih menyeluruh yang复盖 kedua Youngstown dan Oldville. Ini lebih lambat dan kurang kerap daripada Minor GC.

Full GC dipicu apabila:

  • Generasi Tua menjadi penuh
  • Metaspace menjadi penuh

Berikut adalah contoh yang mungkin memicu Full GC:

public class ContohFullGC {
public static void main(String[] args) {
List<byte[]> list = new ArrayList<>();
while (true) {
// Terus mengalokasikan memori
byte[] b = new byte[1024 * 1024]; // 1MB
list.add(b);
}
}
}

Program ini terus mengalokasikan memori tanpa melepaskan itu. Akhirnya, ia akan mengisi penuh Generasi Tua dan memicu Full GC.

Penalaan Pengumpul Rakit

Penalaan pengumpul rakit adalah seperti menalaan jadual pembersihan anda. Ini adalah topik tingkat lanjut, tetapi di sini adalah beberapa tips dasar:

  1. Pilih pengumpul yang tepat untuk aplikasi anda
  2. Sesuaikan ukuran rakit dan ukuran generasi
  3. Tetapkan pengelogan GC yang sesuai

Berikut adalah contoh cara untuk menetapkan pengumpul rakit dan ukuran rakit apabila menjalankan aplikasi Java:

java -XX:+UseG1GC -Xmx4g -Xms4g MyApplication

Arahan ini menggunakan Pengumpul Rakit G1 dan menetapkan kedua ukuran rakit maksimum dan awal ke 4GB.

Ingat, penalaan pengumpulan rakit sangat bergantung kepada aplikasi dan lingkungan anda yang spesifik. Ini sering menjadi proses percobaan dan pengawasan.

Dan itu adalah, para pelajar saya yang tercinta! Kita telah melakukan perjalanan yang pusing di atas Pengumpulan Rakit Java. Dari memahami apa itu, menjelajahi jenis pengumpul dan generasi yang berbeza, hingga melihat bagaimana Minor dan Full GC bekerja, anda sekarang dilengkapi dengan dasar-dasar dari aspek krusial ini dalam pemrograman Java.

Ingat, Pengumpulan Rakit adalah seperti rakit penyedia yang rajin bekerja di belakang layar program Java anda. Sementara ia melakukan kerja mereka, anda dapat fokuskan pada menulis kod yang menakjubkan. Happy coding, dan semoga memori anda selalu bersih dan rapi!

Credits: Image by storyset