Rumah > Soal Jawab > teks badan
黄舟2017-04-18 09:45:39
Kira Rujukan
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.
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.
大家讲道理2017-04-18 09:45:39
Pengumpulan sampah Python menggunakan kaedah pengiraan rujukan Prinsip pengiraan rujukan boleh didapati dalam talian Peringkat pengagih python berikut
PHP中文网2017-04-18 09:45:39
Malah, ini bukan sahaja pengiraan rujukan, tetapi juga penyapuan tanda dan kitar semula generasi ini meringkaskannya dengan sangat baik
http://hbprotoss.github.io/po...
PHP中文网2017-04-18 09:45:39
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.
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
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.
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.