Berikut adalah contoh yang sedikit berbeda, satu dengan bidang jenis referensi akhir daripada variabel lokal jenis nilai akhir:
public class MyClass {
public final MyOtherObject obj;
}
Setiap kali Anda membuat instance MyClass, Anda akan membuat referensi keluar ke instance MyOtherObject, dan GC harus mengikuti tautan tersebut untuk mencari objek langsung.
JVM menggunakan algoritme GC mark-sweep, yang harus memeriksa semua referensi langsung di lokasi "akar" GC (seperti semua objek dalam tumpukan panggilan saat ini). Setiap benda hidup "ditandai" sebagai hidup, dan setiap benda yang dirujuk oleh benda hidup juga ditandai sebagai hidup.
Setelah menyelesaikan fase mark, GC menyapu heap, membebaskan memori untuk semua objek yang tidak ditandai (dan memadatkan memori untuk objek aktif yang tersisa).
Selain itu, penting untuk mengetahui bahwa memori heap Java dipartisi menjadi "generasi muda" dan "generasi tua". Semua objek pada awalnya dialokasikan untuk generasi muda (kadang-kadang disebut sebagai "kamar bayi"). Karena sebagian besar objek berumur pendek, GC lebih agresif dalam membebaskan sampah terbaru dari generasi muda. Jika sebuah objek bertahan dalam siklus pengumpulan generasi muda, ia akan dipindahkan ke generasi lama (terkadang disebut sebagai "generasi bertenor"), yang lebih jarang diproses.
Jadi, di luar kepala saya, saya akan mengatakan "tidak, modifer 'terakhir' tidak membantu GC mengurangi beban kerjanya".
Menurut pendapat saya, strategi terbaik untuk mengoptimalkan manajemen memori Anda di Java adalah dengan menghilangkan referensi palsu secepat mungkin. Anda dapat melakukannya dengan menetapkan "null" ke referensi objek segera setelah Anda selesai menggunakannya.
Atau, lebih baik lagi, minimalkan ukuran setiap cakupan deklarasi. Misalnya, jika Anda mendeklarasikan sebuah objek di awal metode 1000-baris, dan jika objek tetap hidup hingga penutupan cakupan metode itu (tanda kurung kurawal penutup terakhir), objek mungkin tetap hidup lebih lama dari yang sebenarnya. perlu.
Jika Anda menggunakan metode kecil, dengan hanya selusin baris kode, maka objek yang dideklarasikan di dalam metode itu akan keluar dari cakupan lebih cepat, dan GC akan dapat melakukan sebagian besar pekerjaannya dalam lingkungan yang jauh lebih efisien. generasi muda. Anda tidak ingin objek dipindahkan ke generasi yang lebih tua kecuali benar-benar diperlukan.