Kekalkan kiraan rujukan untuk setiap objek ingatan. Apabila rujukan baharu menghala ke objek, kiraan rujukan objek ditambah satu Apabila rujukan kepada objek dimusnahkan, kiraan dikurangkan dengan satu Apabila kiraan kembali kepada sifar, objek diduduki oleh objek dikitar semula sumber ingatan.
Tanda-Jelas
Ia terbahagi kepada dua langkah, satu adalah menanda, iaitu membezakan objek sampah yang tidak akan digunakan lagi daripada banyak objek ingatan yang satu lagi ialah mengosongkan, iaitu mengosongkan yang ditanda objek sampah. Semasa menandakan, anda perlu menentukan set Root objek memori Semua objek dalam set boleh diakses. Jika objek dalam set Root merujuk kepada objek lain, objek yang dirujuk tidak boleh ditandakan sebagai objek sampah. Kemudian bermula dari set Root, rekursif melintasi semua objek yang set Root boleh akses dan tandainya sebagai bukan objek sampah. Selepas traversal selesai, objek yang tidak ditanda adalah objek sampah.
Kumpul mengikut generasi
Menurut kesimpulan statistik, jika objek ingatan didapati bukan sampah semasa proses Mark, maka kemungkinan ia menjadi sampah dalam jangka pendek adalah sangat kecil. Pengumpulan generasi mengumpul objek ingatan yang belum ditandakan sebagai objek sampah dalam berbilang proses pengumpulan sampah ke kawasan lain - kawasan lama, iaitu objek ingatan di kawasan ini lebih lama. Oleh kerana kebarangkalian objek ingatan di kawasan lama menjadi sampah dalam jangka pendek adalah sangat rendah, kekerapan kutipan sampah di kawasan ini dapat dikurangkan Sebaliknya, objek di kawasan muda tertakluk kepada kutipan sampah berfrekuensi tinggi. Ini meningkatkan prestasi keseluruhan kutipan sampah.
Pengurusan memori dalam Python
Dalam CPython, kitaran hayat kebanyakan objek diuruskan melalui kiraan rujukan objek. Pengiraan rujukan ialah pengiraan kutipan sampah yang paling intuitif dan mudah Berbanding dengan algoritma GC arus perdana yang lain, kelebihan terbesarnya ialah prestasi masa nyata, iaitu, sebarang memori akan dikitar semula serta-merta apabila tiada rujukan yang menunjuk kepadanya.
Walau bagaimanapun, pengiraan rujukan mempunyai dua kelemahan yang menyusahkan:
Apabila rujukan bulat berlaku dalam atur cara, kiraan rujukan tidak dapat mengesannya, dan objek memori yang dirujuk oleh kitaran menjadi memori tidak boleh dikitar semula, menyebabkan kebocoran memori. Contohnya:
list1 = []
list1.append(list1)
del list1
list1 merujuk kepada dirinya sendiri Selepas baris kedua dilaksanakan, GC list1 menjadi 2. Selepas operasi del dilaksanakan, kiraan rujukan list1 menjadi 1 dan tidak ditetapkan semula kepada sifar. . , ruang memori list1 belum dikeluarkan, menyebabkan kebocoran memori. Mengekalkan kiraan rujukan memerlukan operasi tambahan.
Kiraan rujukan perlu diubah suai setiap kali objek memori dirujuk atau rujukan dimusnahkan jenis operasi ini dipanggil footprint. Kiraan rujukan footprint adalah sangat tinggi, yang sangat mempengaruhi prestasi keseluruhan program.
Untuk menyelesaikan masalah rujukan bulat, CPython telah mereka bentuk khas modul - GC module Fungsi utamanya adalah untuk memeriksa objek sampah dengan rujukan bulat dan membersihkannya. Pelaksanaan modul ini sebenarnya memperkenalkan dua teknologi kutipan sampah arus perdana yang dinyatakan sebelum ini - pembersihan tanda dan kutipan generasi.
Untuk menyelesaikan masalah prestasi pengiraan rujukan dan cuba mendapatkan kecekapan tertinggi dalam peruntukan dan pelepasan memori, Python juga telah mereka bentuk sejumlah besar mekanisme kumpulan memori.
Python GC terutamanya menggunakan pengiraan rujukan untuk menjejak dan mengitar semula sampah. Atas dasar pengiraan rujukan, "tanda dan sapu" digunakan untuk menyelesaikan masalah rujukan bulat yang mungkin berlaku dalam objek kontena, dan "pengumpulan generasi" digunakan untuk meningkatkan kecekapan pengumpulan sampah dengan menukar ruang untuk masa.
1 kiraan rujukan
PyObject ialah kandungan yang mesti ada untuk setiap objek, dengan ob_refcnt digunakan sebagai kiraan rujukan. Apabila objek mempunyai rujukan baharu, ob_refcntnya akan dinaikkan, dan apabila objek yang merujuknya dipadamkan, ob_refcntnya akan dikurangkan Apabila kiraan rujukan mencapai 0, hayat objek itu tamat.
Kelebihan:
Mudah
Masa nyata
Kelemahan:
Mengekalkan pengiraan rujukan menggunakan sumber
Rujukan Pekeliling
2 Mekanisme tanda-jelas
Idea asasnya adalah untuk memperuntukkan atas permintaan dahulu, dan apabila tiada memori kosong, mulakan dari daftar dan rujukan pada susunan atur cara, melintasi graf yang terdiri daripada objek sebagai nod dan rujukan sebagai tepi, dan tandakan semua objek yang boleh diakses , dan kemudian bersihkan ruang memori dan lepaskan semua objek yang tidak bertanda.
Teknologi 3 generasi
Idea keseluruhan kitar semula generasi adalah untuk membahagikan semua blok memori dalam sistem kepada koleksi yang berbeza mengikut masa kelangsungan hidup mereka. Setiap koleksi menjadi "generasi". generasi". Ia bertambah dan berkurang, dan masa kelangsungan hidup biasanya diukur dengan berapa banyak kutipan sampah yang diperlukan.
Python mentakrifkan koleksi objek tiga generasi secara lalai Lebih besar nombor indeks, lebih lama masa hidup objek.
Algoritma GC biasa
Kira Rujukan
Tanda-Jelas
Kumpul mengikut generasi
Pengurusan memori dalam Python
Dalam CPython, kitaran hayat kebanyakan objek diuruskan melalui kiraan rujukan objek. Pengiraan rujukan ialah pengiraan kutipan sampah yang paling intuitif dan mudah Berbanding dengan algoritma GC arus perdana yang lain, kelebihan terbesarnya ialah prestasi masa nyata, iaitu, sebarang memori akan dikitar semula serta-merta apabila tiada rujukan yang menunjuk kepadanya.
Walau bagaimanapun, pengiraan rujukan mempunyai dua kelemahan yang menyusahkan:
Apabila rujukan bulat berlaku dalam atur cara, kiraan rujukan tidak dapat mengesannya, dan objek memori yang dirujuk oleh kitaran menjadi memori tidak boleh dikitar semula, menyebabkan kebocoran memori. Contohnya:
list1
merujuk kepada dirinya sendiri Selepas baris kedua dilaksanakan, GClist1
menjadi 2. Selepas operasidel
dilaksanakan, kiraan rujukanlist1
menjadi 1 dan tidak ditetapkan semula kepada sifar. . , ruang memori list1 belum dikeluarkan, menyebabkan kebocoran memori.Mengekalkan kiraan rujukan memerlukan operasi tambahan.
Kiraan rujukan perlu diubah suai setiap kali objek memori dirujuk atau rujukan dimusnahkan jenis operasi ini dipanggil
footprint
. Kiraan rujukanfootprint
adalah sangat tinggi, yang sangat mempengaruhi prestasi keseluruhan program.Untuk menyelesaikan masalah rujukan bulat, CPython telah mereka bentuk khas modul -
GC module
Fungsi utamanya adalah untuk memeriksa objek sampah dengan rujukan bulat dan membersihkannya. Pelaksanaan modul ini sebenarnya memperkenalkan dua teknologi kutipan sampah arus perdana yang dinyatakan sebelum ini - pembersihan tanda dan kutipan generasi.Untuk menyelesaikan masalah prestasi pengiraan rujukan dan cuba mendapatkan kecekapan tertinggi dalam peruntukan dan pelepasan memori, Python juga telah mereka bentuk sejumlah besar mekanisme kumpulan memori.
Pengumpulan sampah Python menggunakan kaedah pengiraan rujukan Prinsip pengiraan rujukan boleh didapati dalam talian Peringkat pengagih python berikut
.Malah, ini bukan sahaja pengiraan rujukan, tetapi juga penyapuan tanda dan kitar semula generasi ini meringkaskannya dengan sangat baik
http://hbprotoss.github.io/po...
Python GC terutamanya menggunakan pengiraan rujukan untuk menjejak dan mengitar semula sampah. Atas dasar pengiraan rujukan, "tanda dan sapu" digunakan untuk menyelesaikan masalah rujukan bulat yang mungkin berlaku dalam objek kontena, dan "pengumpulan generasi" digunakan untuk meningkatkan kecekapan pengumpulan sampah dengan menukar ruang untuk masa.
1 kiraan rujukan
PyObject ialah kandungan yang mesti ada untuk setiap objek, dengan
ob_refcnt
digunakan sebagai kiraan rujukan. Apabila objek mempunyai rujukan baharu,ob_refcnt
nya akan dinaikkan, dan apabila objek yang merujuknya dipadamkan,ob_refcnt
nya akan dikurangkan Apabila kiraan rujukan mencapai 0, hayat objek itu tamat.Kelebihan:
Mudah
Masa nyata
Kelemahan:
Mengekalkan pengiraan rujukan menggunakan sumber
Rujukan Pekeliling
2 Mekanisme tanda-jelas
Idea asasnya adalah untuk memperuntukkan atas permintaan dahulu, dan apabila tiada memori kosong, mulakan dari daftar dan rujukan pada susunan atur cara, melintasi graf yang terdiri daripada objek sebagai nod dan rujukan sebagai tepi, dan tandakan semua objek yang boleh diakses , dan kemudian bersihkan ruang memori dan lepaskan semua objek yang tidak bertanda.
Teknologi 3 generasi
Idea keseluruhan kitar semula generasi adalah untuk membahagikan semua blok memori dalam sistem kepada koleksi yang berbeza mengikut masa kelangsungan hidup mereka. Setiap koleksi menjadi "generasi". generasi". Ia bertambah dan berkurang, dan masa kelangsungan hidup biasanya diukur dengan berapa banyak kutipan sampah yang diperlukan.
Python mentakrifkan koleksi objek tiga generasi secara lalai Lebih besar nombor indeks, lebih lama masa hidup objek.