[Hanya ingin menambahkan lebih jauh pada proses Internalisasi Finalisasi]
Jadi, Anda membuat objek dan ketika objek dikumpulkan, Finalize
metode objek harus dipanggil. Tetapi ada lebih banyak finalisasi daripada asumsi yang sangat sederhana ini.
KONSEP SINGKAT ::
Objek TIDAK menerapkan Finalize
metode, di sana Memori segera diperoleh kembali, kecuali tentu saja, mereka tidak dapat dijangkau oleh
kode aplikasi lagi
Objek menerapkan Finalize
Metode, Konsep / Pelaksanaan Application Roots
, Finalization Queue
, Freacheable Queue
datang sebelum mereka dapat direklamasi.
Setiap objek dianggap sampah jika TIDAK dapat dicapai oleh Kode Aplikasi
Asumsikan :: Kelas / Objek A, B, D, G, H JANGAN mengimplementasikan Finalize
Metode dan C, E, F, I, J mengimplementasikan Finalize
Metode.
Ketika aplikasi membuat objek baru, operator baru mengalokasikan memori dari heap. Jika tipe objek berisi Finalize
metode, maka pointer ke objek ditempatkan pada antrian finalisasi .
Oleh karena itu pointer ke objek C, E, F, I, J akan ditambahkan ke antrian finalisasi.
The antrian finalisasi adalah struktur data internal dikendalikan oleh pengumpul sampah. Setiap entri dalam antrian menunjuk ke suatu objek yang seharusnya memiliki Finalize
metode yang dipanggil sebelum memori objek dapat direklamasi. Gambar di bawah ini menunjukkan tumpukan yang berisi beberapa objek. Beberapa objek ini dapat dijangkau dari akar aplikasi, dan ada juga yang tidak. Ketika objek C, E, F, I, dan J dibuat, framework .Net mendeteksi bahwa objek-objek ini memiliki Finalize
metode dan pointer ke objek-objek ini ditambahkan ke antrian finalisasi .
Ketika GC terjadi (Koleksi 1), objek B, E, G, H, I, dan J ditentukan sebagai sampah. Karena A, C, D, F masih dapat dijangkau oleh Kode Aplikasi yang digambarkan melalui panah dari Kotak kuning di atas.
Pengumpul sampah memindai antrian finalisasi mencari pointer ke objek-objek ini. Ketika sebuah pointer ditemukan, pointer tersebut dihapus dari antrian finalisasi dan ditambahkan ke antrian yang dapat diakses ("F-reachable").
The antrian freachable lain adalah struktur data internal dikendalikan oleh pengumpul sampah. Setiap pointer di antrian yang dapat di- freach mengidentifikasi sebuah objek yang siap Finalize
dipanggil metode.
Setelah pengumpulan (Koleksi 1), tumpukan yang dikelola terlihat mirip dengan gambar di bawah ini. Penjelasan yang diberikan di bawah ini:
1.) Memori yang ditempati oleh objek B, G, dan H telah direklamasi segera karena objek-objek ini tidak memiliki metode penyelesaian yang perlu dipanggil .
2.) Namun, memori ditempati oleh objek E, I, dan J tidak dapat direklamasi karena merekaFinalize
metode belum dipanggil.
Memanggil metode Finalisasi dilakukan dengan antrean yang dapat disimpan.
3.) A, C, D, F masih dapat dijangkau oleh Kode Aplikasi yang digambarkan melalui panah dari Kotak kuning di atas, Jadi mereka TIDAK akan dikumpulkan dalam hal apa pun
Ada utas runtime khusus yang didedikasikan untuk memanggil metode Finalisasi. Ketika antrian yang dapat dibuka kosong (yang biasanya terjadi), utas ini tertidur. Tetapi ketika entri muncul, utas ini bangun, menghapus setiap entri dari antrian, dan memanggil metode Finalisasi masing-masing objek. Pengumpul sampah memadatkan memori yang dapat direklamasi dan utas runtime khusus mengosongkan antrian yang dapat dibuka , menjalankan Finalize
metode setiap objek . Jadi di sini akhirnya adalah ketika metode Finalisasi Anda dijalankan
Kali berikutnya pemulung dipanggil (2nd Collection), ia melihat bahwa objek yang diselesaikan benar-benar sampah, karena akar aplikasi tidak menunjuk ke sana dan antrian yang tidak dapat dihapus tidak lagi menunjuk ke sana (itu juga KOSONG), oleh karena itu memori untuk objek (E, I, J) hanya direklamasi dari Heap. Lihat gambar di bawah ini dan bandingkan dengan gambar di atas
Hal penting untuk dipahami di sini adalah bahwa dua GC diperlukan untuk mendapatkan kembali memori yang digunakan oleh objek yang membutuhkan finalisasi . Pada kenyataannya, lebih dari dua koleksi taksi bahkan diperlukan karena benda-benda ini dapat dipromosikan ke generasi yang lebih tua
CATATAN:: The antrian freachable dianggap akar seperti variabel global dan statis adalah akar. Oleh karena itu, jika suatu objek berada pada antrian yang dapat diraih, maka objek tersebut dapat dijangkau dan bukan sampah.
Sebagai catatan terakhir, ingatlah bahwa aplikasi debugging adalah satu hal, Pengumpulan Sampah adalah hal lain dan berfungsi secara berbeda. Sejauh ini Anda tidak dapat MERASA pengumpulan sampah hanya dengan men-debug aplikasi, lebih jauh jika Anda ingin menyelidiki Memori, mulailah dari sini.