Garis perilaku pengumpul sampah (memory reclaimer)
Pemrogram Java tidak perlu memantau alokasi memori karena pengumpul sampah mengelola memori secara otomatis. Pengumpul Sampah dijalankan oleh Java Virtual Machine (JVM). Pengumpul sampah adalah proses berprioritas rendah yang berjalan secara berkala dan membebaskan memori yang digunakan oleh objek yang tidak lagi diperlukan. JVM yang berbeda memiliki algoritma pengumpulan sampah yang berbeda. Ada beberapa algoritma yang digunakan, misalnya: algoritma penghitungan referensi atau algoritma markup dan scraping.
Menjalankan pengumpul sampah di Jawa
JVM biasanya menjalankan pengumpul sampah ketika memori bebas rendah. Namun pengoperasian pengumpul sampah tidak menjamin bahwa memori bebas akan selalu cukup. Jika tidak ada cukup memori bahkan setelah pemulihan, JVM akan memunculkan pengecualian OutOfMemoryError. Harap dicatat bahwa JVM harus menjalankan pengumpul sampah setidaknya sekali sebelum mengeluarkan pengecualian. Anda dapat meminta pengumpul sampah untuk dijalankan di Java, namun Anda tidak dapat memaksakan tindakan ini.
Permintaan untuk menjalankan pengumpul sampah
Untuk membuat permintaan, Anda dapat memanggil salah satu metode berikut:
System.gc()
Runtime.getRuntime().gc()
Kesesuaian untuk menjalankan pengumpul sampah
Suatu benda harus dibuang bila tidak lagi dapat diakses oleh aliran hidup. Suatu benda dapat dibuang dalam berbagai kasus:
- Jika variabel tipe referensi yang merujuk ke suatu objek disetel ke "0", objek tersebut harus dibuang jika tidak ada referensi lain ke sana.
- Jika variabel bertipe referensi yang merujuk ke suatu objek dibuat untuk merujuk ke objek lain, objek tersebut harus dibuang jika tidak ada referensi lain ke sana.
- Objek yang dibuat secara lokal dalam suatu metode akan dibuang ketika metode tersebut keluar, kecuali objek tersebut diekspor dari metode tersebut (yaitu, dikembalikan atau dilempar sebagai pengecualian).
- Objek yang saling mereferensikan dapat dibuang jika tidak ada satu pun yang tersedia di thread langsung.
Mari kita lihat sebuah contoh:
public class TestGC
{
public static void main(String [] args)
{
Object o1 = new Integer(3);
Object o2 = new String("Tutorial");
o1 = o2;
o2 = null;
}
}
Dalam contoh ini
Integer
, objek (integer) yang awalnya direferensikan oleh pointer o1 dapat dibuang setelah baris 3 karena o1 sekarang merujuk ke objek
String
(string). Meskipun o2 dibuat untuk merujuk pada null, objek
String
(string) tidak dapat didaur ulang karena o1 merujuk padanya.
Finalisasi
Teknologi Java memungkinkan Anda menggunakan metode
finalize()
(menyelesaikan) untuk melakukan pembersihan yang diperlukan sebelum pengumpul sampah mengambil objek dari memori. Metode ini dipanggil pada suatu objek oleh pengumpul sampah ketika pengumpul sampah menentukan bahwa tidak ada lagi referensi ke objek tersebut. Hal ini dijelaskan di class
Object
, yang artinya diwarisi oleh semua kelas. Subkelas mengesampingkan metode
finalize()
untuk membebaskan dirinya dari sumber daya sistem atau untuk pembersihan lainnya:
protected void finalize() throws Throwable
Jika pengecualian yang tidak terdaftar dilempar oleh metode ini
finalize()
, pengecualian tersebut diabaikan dan finalisasi objek tersebut berhenti. Metode ini
finalize()
hanya akan dipanggil satu kali selama masa hidup objek. Dimungkinkan untuk menggunakan metode
finalize()
pada objek apa pun untuk melindunginya dari pembuangan. Namun dalam kasus ini, pengumpul sampah tidak lagi diaktifkan
finalize()
untuk objek ini. Metode ini
finalize()
akan selalu dipanggil satu kali sebelum objek dikumpulkan sampahnya. Namun, ada kemungkinan bahwa metode tersebut
finalize()
tidak akan diaktifkan untuk objek tertentu selama keberadaannya, karena metode tersebut mungkin tidak dapat dimusnahkan.
Ringkasan
Di bagian ini, kita melihat proses pengumpulan sampah, yang merupakan teknik manajemen memori dalam bahasa Java. Pengumpulan sampah tidak bisa dipaksakan. Kami mempelajari berbagai cara untuk membuat benda memenuhi syarat untuk didaur ulang dan mempelajari bahwa metode ini
finalize()
digunakan sebelum benda tersebut direklamasi oleh pemulung.
Latihan
Pertanyaan: Berapa banyak benda yang akan dibuang setelah baris 7?
public class TutorialGC
{
public static void main(String [] args)
{
Object a = new Integer(100);
Object b = new Long(100);
Object c = new String("100");
a = null;
a = c;
c = b;
b = a;
}
}
Pilihan jawaban : A. 0 B. 1 C. 2 D. 3 E. Kode tidak dapat disusun
Pilihan yang benar : B
Penjelasan : Dari ketiga benda yang dibuat pada baris 1, 2 dan 3, hanya benda tersebut
Integer
yang harus dibuang ke tempat akhir baris 7. Referensi variabel, a, yang awalnya mereferensikan objek
Integer
, mereferensikan objek
String
pada baris 5. Jadi,
Integer
objek tersebut harus dibuang setelah baris 5, karena tidak ada variabel yang mereferensikannya. Variabel
b
dan
c
mengacu pada objek
String
dan
Long
objek pada baris 6 dan 7, sehingga tidak dapat didaur ulang.
GO TO FULL VERSION