JavaRush /Blog Java /Random-MS /Pengumpul Sampah di Jawa
Diana
Tahap

Pengumpul Sampah di Jawa

Diterbitkan dalam kumpulan

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.Kutipan sampah - 1

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);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
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);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
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 Integeryang mesti dilupuskan di hujung baris 7. Rujukan pembolehubah, a, yang pada asalnya merujuk objek Integer, merujuk objek Stringpada baris 5. Oleh itu, Integerobjek mesti dilupuskan selepas baris 5, kerana tiada pembolehubah yang merujuknya. Pembolehubah bdan crujuk kepada objek Stringdan Longobjek dalam baris 6 dan 7, jadi ia tidak boleh dikitar semula.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION