Python里的垃圾回收机制是什么意思,搞不懂?
迷茫
迷茫 2017-04-18 09:43:39
0
4
570

简单的例子来说一说Python里的垃圾回收机制,O(∩_∩)O谢谢。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(4)
黄舟

Algoritma GC biasa

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.

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.

大家讲道理

Pengumpulan sampah Python menggunakan kaedah pengiraan rujukan Prinsip pengiraan rujukan boleh didapati dalam talian Peringkat pengagih python berikut

.
Ty80

Malah, ini bukan sahaja pengiraan rujukan, tetapi juga penyapuan tanda dan kitar semula generasi ini meringkaskannya dengan sangat baik

http://hbprotoss.github.io/po...

Ty80

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:

  1. Mudah

  2. Masa nyata

Kelemahan:

  1. Mengekalkan pengiraan rujukan menggunakan sumber

  2. 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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan