Memperbarui referensi bukan satu-satunya hal yang membutuhkan jeda. Algoritma standar yang biasanya dikelompokkan dalam "mark-sweep" semuanya mengasumsikan bahwa seluruh grafik objek tetap tidak berubah saat sedang ditandai. Menangani modifikasi dengan benar (objek baru yang dibuat, referensi diubah) memerlukan algoritma alternatif yang agak rumit, seperti sebagai algoritma tri-warna. Istilah payung adalah "pengumpulan sampah bersamaan".
Tapi ya, memperbarui referensi setelah pemadatan juga perlu jeda. Dan ya, menggunakan tipuan (misalnya melalui objek ID persisten dan tabel hash ke pointer nyata) dapat sangat mengurangi jeda. Bahkan mungkin membuat bagian ini bebas dari penguncian jika diinginkan. Masih sulit untuk mendapatkan kebenaran seperti konkurensi memori bersama tingkat rendah, tetapi tidak ada alasan mendasar mengapa hal itu tidak berhasil.
Namun , itu akan memiliki kerugian parah. Selain mengambil ruang ekstra ( setidaknya dua kata tambahan untuk semua objek), itu membuat setiap dereferensi jauh lebih mahal. Bahkan sesuatu yang sederhana seperti mendapatkan atribut sekarang melibatkan pencarian tabel hash penuh. Saya memperkirakan kinerja hit jauh lebih buruk daripada untuk penelusuran tambahan.
Pendekatan Anda tidak segera menyelesaikan masalah pengumpulan sampah, tetapi hanya memindahkannya satu tingkat. Dan berapa biayanya! Sekarang, setiap akses memori melewati dereference pointer lain. Kami tidak dapat men-cache lokasi hasil, karena itu mungkin telah dipindahkan sementara itu, kami harus selalu melalui ID objek. Dalam kebanyakan sistem, tipuan ini tidak dapat diterima, dan menghentikan dunia diasumsikan memiliki total biaya runtime yang lebih rendah.
Saya mengatakan proposisi Anda hanya menggerakkan masalah, bukan menyelesaikannya. Masalahnya adalah sekitar penggunaan kembali ID objek. ID objek sekarang setara dengan pointer kami, dan hanya ada jumlah alamat yang terbatas. Dapat dibayangkan (khususnya pada sistem 32 bit) bahwa selama masa hidup program Anda, lebih dari objek INT_MAX akan dibuat, misalnya dalam satu lingkaran seperti
Jika kami hanya menambah ID objek untuk setiap objek, kami akan kehabisan ID di beberapa titik. Oleh karena itu kita harus mencari tahu ID mana yang masih digunakan dan yang gratis sehingga dapat direklamasi. Terdengar akrab? Kami sekarang kembali di titik awal.
sumber
Tidak ada kesalahan dalam pemikiran Anda, Anda baru saja menggambarkan sesuatu yang sangat dekat dengan cara kerja pengumpul sampah Java asli
Jadi itu berhasil, telah dicoba, dan inefisiensi menyebabkan pengembangan tanda generasi dan sistem sapuan.
sumber
Object.getHashCode()