Objek dibuat menggunakan yang baru, tetapi tidak ada operasi penghapusan yang sesuai untuk mendaur ulang memori yang ditempati oleh objek. Ketika kami menyelesaikan penggunaan objek, kami cukup berhenti merujuk pada objek itu: ubah referensi kami untuk menunjuk ke objek lain atau ke nol; atau kembali dari metode sehingga variabel lokal dari metode ini tidak ada lagi, sehingga referensi ke variabel lokal ini menjadi tidak menunjuk ke objek apa pun. Objek yang tidak lagi dirujuk disebut sampah. Proses menemukan dan mendaur ulang benda -benda ini disebut koleksi sampah o
Mesin virtual Java menggunakan pengumpulan sampah untuk memastikan bahwa objek yang direferensikan akan dipertahankan dalam memori, dan juga akan membebaskan ruang penyimpanan yang ditempati oleh objek yang tidak dapat dijangkau melalui referensi apa pun dalam kode eksekusi. Ini adalah jaminan yang kuat bahwa jika suatu objek tidak didaur ulang jika rantai referensi mulai dari referensi root (mis., Referensi yang dapat secara langsung diakses dalam kode eksekusi).
Singkatnya, ketika kita tidak dapat mencapai objek dari kode yang dapat dieksekusi, ruang yang dibutuhkan dapat didaur ulang. Perhatikan bahwa kami menggunakan kata "dapat" karena apakah ruang memori didaur ulang ditentukan oleh pengumpul sampah. Secara umum, pengumpul sampah hanya akan berjalan jika lebih banyak ruang memori diperlukan atau untuk menghindari overflow memori. Namun, program dapat keluar tanpa memori overflow, atau bahkan ketika tidak dekat dengan memori overflow, jadi mungkin tidak memerlukan pengumpulan sampah sama sekali. Dalam semua metode yang saat ini dieksekusi, jika semua variabel berisi referensi ke suatu objek, dan mulai dari variabel -variabel ini, referensi ke objek ini tidak dapat ditemukan di semua domain atau elemen array di sepanjang rantai referensi, maka kita mengatakan bahwa objek itu "tidak terjangkau".
Recycling sampah berarti kita tidak perlu khawatir tentang referensi yang menggantung. Dalam sistem di mana pemrogram dapat secara langsung mengontrol ketika objek dihapus, pemrogram dapat menghapus objek yang masih dirujuk oleh objek lain. Jika pemrogram menghapus objek tersebut, referensi yang masih merujuk objek yang dihapus akan menjadi batal karena merujuk pada keheningan.
Sistem menganggapnya sebagai ruang memori yang dapat dialokasikan (tetapi pada kenyataannya ruang telah dirilis). Sistem dapat mengalokasikan ruang yang dapat dialokasikan ini ke objek baru, sehingga referensi awalnya menunjuk ke ruang sebenarnya menghasilkan objek yang sama sekali berbeda dari apa yang mereka harapkan. Dalam hal ini, bencana yang tidak dapat diprediksi dapat terjadi ketika program menggunakan nilai yang disimpan dalam ruang ini dan mengoperasikannya sebagai objek yang bukan milik mereka. Koleksi sampah memecahkan masalah referensi gantung bagi kami, karena semua objek yang masih dirujuk tidak akan diperlakukan sebagai pengumpulan sampah, sehingga ruang yang mereka tempati tidak dapat dibebaskan. Pengumpulan sampah juga memecahkan masalah secara tidak sengaja menghapus objek yang sama beberapa kali - masalah ini juga dapat menyebabkan bencana. Daur ulang benda sampah tidak memerlukan intervensi kami, tetapi daur ulang sampah akan menempati sejumlah sumber daya sistem. Penciptaan dan daur ulang sejumlah besar objek dapat mengganggu aplikasi kritis waktu, jadi ketika merancang sistem tersebut, kita harus hati-hati menangani jumlah objek yang dibuat untuk mengurangi jumlah sampah yang akan didaur ulang.
Pengumpulan sampah tidak menjamin bahwa memori akan selalu memiliki ruang untuk membuat objek baru. Misalnya, jika kita terus membuat objek dan memasukkannya ke dalam daftar, kita tidak dapat lagi membuat objek baru ketika tidak ada cukup ruang untuk membuat objek baru dan tidak ada objek yang tidak direferensikan. Jika kita menyimpan daftar referensi di atas ke objek yang tidak lagi diperlukan, maka kebocoran memori akan terjadi. Koleksi sampah memecahkan banyak (tetapi tidak semua) masalah alokasi memori.
Berinteraksi dengan pengumpul sampah
Meskipun bahasa Java itu sendiri tidak memiliki cara eksplisit untuk membuang objek idle, kita masih dapat menemukan objek yang tidak lagi digunakan dengan memanggil pengumpul sampah secara langsung. Beberapa metode yang nyaman di kelas runtime dan kelas sistem memungkinkan kami untuk memanggil pengumpul sampah, meminta untuk menjalankan semua finalzer yang akan dijalankan, atau melihat status memori saat ini:
.Public void GC Q: Metode ini meminta mesin virtual Java untuk menghabiskan objek daur ulang energi yang tidak lagi digunakan sehingga dapat menggunakan kembali memori yang ditempati oleh objek -objek ini.
.Public void runfinalization (): Metode ini meminta mesin virtual Java untuk menghabiskan energi menjalankan finalisasi berikut: objek yang telah ditemukan tidak terjangkau tetapi yang finorizer belum dieksekusi.
"Public Long Freedom (): Mengembalikan perkiraan jumlah byte yang tersedia dalam memori sistem.
・ Public Long Total Memory (): Mengembalikan jumlah total byte dalam memori sistem.
.Public long maxmemoryo: Mengembalikan jumlah maksimum byte memori sistem yang tersedia untuk mesin virtual java. Jika sistem operasi tidak memiliki batasan penggunaan memori pada mesin virtual Java, panjang. Max-Value akan dikembalikan. Tidak ada metode di Java untuk mengatur memori maksimum sistem. Biasanya, mesin virtual Java mengatur nilai ini melalui baris perintah atau opsi konfigurasi lainnya.
Untuk memanggil metode di atas, kita perlu mendapatkan referensi ke objek runtime saat ini melalui runtime metode statis. GetRuntime. Kelas sistem mendukung GC statis dan metode runfinalization, yang akan memanggil metode yang sesuai pada objek Runt-IME saat ini; Dengan kata lain, System.gc () setara dengan metode runtime.getRuntime (). GC ().
Saat memanggil metode runtime.gc (), pengumpul sampah tidak boleh membebaskan memori tambahan, karena mungkin tidak ada sampah yang akan didaur ulang, dan tidak semua pengumpul sampah dapat menemukan objek yang dapat didaur ulang sesuai permintaan. Oleh karena itu memanggil pengumpul sampah mungkin tidak memiliki efek apa pun. Namun, memanggil metode runtime.gc () diinginkan sebelum membuat sejumlah besar objek, terutama dalam aplikasi kritis waktu di mana overhead pengumpulan sampah dapat memengaruhinya. Ada dua manfaat potensial untuk melaksanakannya: yang pertama adalah bahwa kita bisa mendapatkan sebanyak mungkin memori sebelum menjalankan aplikasi, dan yang kedua adalah bahwa kita dapat mengurangi kemungkinan pengumpul sampah yang berjalan selama pelaksanaan tugas. Metode berikut secara aktif melepaskan semua ruang yang dapat dirilis saat runtime:
public static vo recordful1gc () {runtime rt = runtime.getRuntime (); long isFree = rt.freememory (); Long Wasfree; do {wasfree = isFree; rt.runfinalisasi (); rt.gc (); isfree two rt.freememory (); } while (isFree> wasfree); }Metode ini terus -menerus melingkar, dan nilai freememory terus meningkat dengan terus memanggil runfinalisasi dan metode GC. Ketika jumlah memori bebas tidak lagi meningkat, loop metode berakhir.
Kami biasanya tidak perlu memanggil metode runfinalisasi karena metode finalisasi disebut secara tidak sinkron oleh pengumpul sampah. Dalam beberapa kasus, misalnya, ketika sumber daya yang dapat didaur ulang dengan metode finalisasi habis, akan berguna untuk menegakkan sebanyak mungkin pemutusan hubungan kerja dengan memanggil run-finalisasi. Tetapi ingat bahwa kami tidak dapat menjamin bahwa objek apa pun yang menunggu untuk diakhiri menggunakan sumber daya ini, sehingga runfinalisasi mungkin tidak memiliki efek apa pun.
Metode fullgc tampaknya terlalu radikal untuk sebagian besar aplikasi. Dalam kasus khusus di mana pengumpulan sampah diperlukan, bahkan jika tidak semua sampah yang tersedia dikumpulkan dengan satu panggilan ke metode System.gc, itu adalah sebagian besar. Oleh karena itu, panggilan berulang akan mengurangi laju output pengumpulan sampah, dan dalam banyak sistem, panggilan berulang ini tidak ada output.