Garis tingkah laku pemungut sampah (penuntut semula ingatan)
Pengaturcara Java tidak perlu memantau peruntukan memori kerana pengumpul sampah menguruskan memori secara automatik. Pengumpul Sampah dikendalikan oleh Java Virtual Machine (JVM). Pengumpul sampah ialah proses keutamaan rendah yang berjalan secara berkala dan membebaskan memori yang digunakan oleh objek yang tidak diperlukan lagi. JVM yang berbeza mempunyai algoritma pengumpulan sampah yang berbeza. Terdapat beberapa algoritma yang digunakan, contohnya: algoritma pengiraan rujukan atau algoritma penandaan dan pengikisan.
Menjalankan pemungut sampah di Jawa
JVM lazimnya menjalankan pemungut sampah apabila memori bebas rendah. Tetapi operasi pemungut sampah tidak menjamin bahawa memori percuma akan sentiasa mencukupi. Jika memori tidak mencukupi walaupun selepas pemulihan, JVM membuang pengecualian OutOfMemoryError. Sila ambil perhatian bahawa JVM mesti menjalankan pemungut sampah sekurang-kurangnya sekali sebelum membuang pengecualian. Anda boleh meminta pengumpul sampah untuk dijalankan di Jawa, tetapi anda tidak boleh memaksa tindakan ini.
Permintaan untuk menjalankan pemungut sampah
Untuk membuat permintaan, anda boleh menghubungi salah satu kaedah berikut:
System.gc()
Runtime.getRuntime().gc()
Kesesuaian untuk menjalankan pengutip sampah
Objek mesti dilupuskan apabila ia tidak lagi tersedia untuk aliran hidup. Objek mungkin tertakluk kepada pelupusan dalam kes yang berbeza:
- Jika pembolehubah jenis rujukan yang merujuk kepada objek ditetapkan kepada "0", objek mesti dilupuskan jika tiada rujukan lain kepadanya.
- Jika pembolehubah jenis rujukan yang merujuk kepada objek dicipta untuk merujuk kepada objek lain, objek mesti dilupuskan jika tiada rujukan lain kepadanya.
- Objek yang dicipta secara tempatan dalam kaedah dibuang apabila kaedah keluar, melainkan ia dieksport daripada kaedah itu (iaitu, dikembalikan atau dibuang sebagai pengecualian).
- Objek yang merujuk antara satu sama lain mungkin tertakluk kepada pelupusan jika tiada satu pun daripadanya tersedia untuk rangkaian langsung.
Mari lihat 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 asalnya dirujuk oleh o1 boleh dilupuskan selepas baris 3 kerana o1 kini merujuk kepada objek
String
(rentetan). Walaupun o2 dicipta untuk merujuk kepada null, objek
String
(rentetan) tidak boleh dikitar semula kerana o1 merujuk kepadanya.
Penyelesaian
Teknologi Java membolehkan anda menggunakan kaedah
finalize()
(memuktamadkan) untuk melakukan pembersihan yang diperlukan sebelum pemungut sampah mengambil objek daripada ingatan. Kaedah ini dipanggil pada objek oleh pemungut sampah apabila pemungut sampah menentukan bahawa tiada lagi rujukan kepada objek tersebut. Ini diterangkan dalam kelas
Object
, yang bermaksud ia diwarisi oleh semua kelas. Subkelas mengatasi kaedah
finalize()
untuk membebaskan dirinya daripada sumber sistem atau untuk pembersihan lain:
protected void finalize() throws Throwable
Jika pengecualian tidak berdaftar dilemparkan oleh method
finalize()
, pengecualian diabaikan dan pemuktamadkan objek itu berhenti. Kaedah ini
finalize()
hanya akan digunakan sekali sepanjang hayat objek. Ia adalah mungkin untuk menggunakan kaedah
finalize()
pada mana-mana objek untuk melindunginya daripada pelupusan. Tetapi dalam kes ini, pemungut sampah tidak lagi diaktifkan
finalize()
untuk objek ini. Kaedah ini
finalize()
akan sentiasa digunakan sekali sebelum objek dikumpul sampah. Walau bagaimanapun, ada kemungkinan kaedah itu
finalize()
tidak akan diaktifkan untuk objek tertentu sepanjang tempoh kewujudannya, kerana ia mungkin tidak tertakluk kepada pelupusan.
Ringkasan
Dalam bahagian ini, kami melihat proses pengumpulan sampah, yang merupakan teknik pengurusan memori dalam bahasa Java. Kutipan sampah tidak boleh dipaksa. Kami belajar tentang cara yang berbeza untuk menjadikan objek layak untuk dikitar semula dan mengetahui bahawa kaedah itu
finalize()
digunakan sebelum objek itu dituntut semula oleh pemungut sampah.
Senaman
Soalan: Berapakah bilangan objek yang akan dilupuskan selepas 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 jawapan: A. 0 B. 1 C. 2 D. 3 E. Kod tidak boleh disusun
Pilihan yang betul: B
Penjelasan: Daripada tiga objek yang dicipta dalam baris 1, 2 dan 3, hanya objek
Integer
yang mesti dilupuskan di hujung baris 7. Rujukan pembolehubah, a, yang pada asalnya merujuk objek
Integer
, merujuk objek
String
pada baris 5. Oleh itu,
Integer
objek mesti dilupuskan selepas baris 5, kerana tiada pembolehubah yang merujuknya. Pembolehubah
b
dan
c
rujuk kepada objek
String
dan
Long
objek dalam baris 6 dan 7, jadi ia tidak boleh dikitar semula.
GO TO FULL VERSION