Rumah > Artikel > pembangunan bahagian belakang > Apakah maksud gc dalam php
Dalam PHP, nama penuh gc ialah "Pengumpulan Sampah", yang bermaksud "pengumpulan sampah" dalam bahasa Cina Ia adalah mekanisme pengurusan memori dinamik yang secara automatik mengeluarkan blok memori yang diperuntukkan yang tidak lagi diperlukan oleh program. Mekanisme GC membolehkan pengaturcara tidak terlalu bimbang tentang peruntukan memori program, supaya mereka boleh menumpukan lebih banyak tenaga kepada logik perniagaan.
Persekitaran pengendalian tutorial ini: sistem windows7, versi PHP7.1, komputer DELL G3
Dalam php, penuh nama gc ialah " Pengumpulan Sampah", yang bermaksud "pengumpulan sampah" dalam bahasa Cina, ialah mekanisme pengurusan memori yang dinamik.
Mekanisme pengumpulan sampah (GC) secara automatik mengeluarkan blok memori yang diperuntukkan yang tidak lagi diperlukan oleh program. Proses menuntut semula memori secara automatik dipanggil kutipan sampah.
Mekanisme kutipan sampah (GC) membolehkan pengaturcara tidak terlalu bimbang tentang peruntukan memori program, supaya mereka boleh menumpukan lebih banyak tenaga kepada logik perniagaan.
Antara pelbagai bahasa popular hari ini, mekanisme kutipan sampah adalah ciri umum bahasa generasi baharu.
Penjanaan sampah
Jenis kompleks dalam PHP7, seperti rentetan, tatasusunan, objek, dll., mempunyai gc dalam pengepala ini digunakan untuk menyokong kutipan sampah. Apabila pembolehubah ditetapkan atau dipindahkan, nombor rujukan nilai akan dinaikkan Apabila pembolehubah dilepaskan dengan tidak ditetapkan, kembali, dsb., nombor rujukan akan ditolak Selepas penolakan, jika pengiraan semula didapati menjadi 0 nilai akan dikeluarkan secara langsung Ini adalah proses kitar semula asas pembolehubah.
Namun, terdapat satu masalah yang tidak dapat diselesaikan oleh mekanisme ini iaitu masalah rujukan pekeliling.
Apakah rujukan pekeliling? Ringkasnya, nilai yang disimpan di dalam pembolehubah merujuk kepada pembolehubah itu sendiri. Perbandingan ini sering berlaku dengan pembolehubah jenis tatasusunan dan objek.
Mari kita bincangkan tentang rujukan dahulu, iaitu jenis zend_reference Ini ialah jenis pembolehubah baharu dalam PHP7 Apabila operasi "&" digunakan pada pembolehubah, struktur perantaraan baru ini struktur sebenarnya akan menunjuk kepada struktur nilai yang sepadan.
Contohnya:
// 当进行如下赋值操作时 $a = 'hello'; // $a -> zend_string $b = $a; // $b,$a -> zend_string $c = &$b; // $c,$b -> zval(type = IS_REFERENCE, refcount = 2) -> zend_string
akhirnya akan menjadi seperti berikut:
Iaitu, zval bagi $b dan $c ialah Tuding kepada zend_string terakhir melalui struktur perantaraan zend_reference.
Berbalik kepada isu rujukan pekeliling, berikut ialah contoh rujukan pekeliling tatasusunan:
$a = [1]; $a[] = &$a; unset($a);
Selepas menggunakan operasi &, pembolehubah a menjadi jenis rujukan dan kiraan semula kiraan rujukan ialah 2, dan Ia juga ditugaskan kepada elemen itu sendiri, iaitu pembolehubah a menjadi rujukan kepada dirinya sendiri.
Butirannya adalah seperti berikut:
Apabila tidak ditetapkan, ia akan menjadi seperti gambar di bawah:
Iaitu, jenis zval di mana $a terletak telah menjadi IS_UNDEF, dan kiraan rujukan struktur rujukan_zend dikurangkan sebanyak 1, tetapi masih lebih besar daripada 0. Pada masa ini, bahagian struktur ini menjadi sampah. Jika ini tidak diproses, ia boleh menyebabkan kebocoran memori. Di sini anda memerlukan pemungut sampah untuk mengumpul bahagian ini ke dalam penimbal dan kemudian mengitar semulanya.
Proses kitar semula
Jika kiraan semula pembolehubah lebih besar daripada 0 selepas ia dikurangkan, PHP tidak akan segera melaksanakan pengenalpastian sampah dan kitar semula pada pembolehubah ini, tetapi akan sebaliknya letakkan Dalam penimbal, tunggu sehingga penimbal penuh (10,000 nilai) dan kemudian proseskannya secara seragam. Apa yang ditambahkan pada penimbal ialah gc dalam pembolehubah zend_value Pada masa ini, sampah hanya akan muncul dalam dua jenis: tatasusunan dan objek . Dalam kes tatasusunan, Seperti yang telah diperkenalkan, dalam kes objek, atribut ahli merujuk kepada objek itu sendiri Dalam jenis lain, ahli dalam pembolehubah merujuk kepada pembolehubah itu sendiri tidak akan berlaku, jadi kutipan sampah sahaja memproses kedua-dua jenis pembolehubah ini.
Struktur gc zend_refcounted_h adalah seperti berikut:
typedef struct _zend_refcounted_h { uint32_t refcount; // 记录 zend_value 的引用数 union { struct { zend_uchar type, // zend_value的类型, 与zval.u1.type一致 zend_uchar flags, uint16_t gc_info // GC信息,记录在 gc 池中的位置和颜色,垃圾回收的过程会用到 } v; uint32_t type_info; } u; } zend_refcounted_h;
Sesuatu pembolehubah hanya boleh ditambahkan pada penimbal sekali Untuk mengelakkan penambahan berulang, zend_refcounted_h.gc_info akan ditetapkan kepada GC_PURPLE. selepas pembolehubah ditambah, iaitu, ditanda Ia berwarna ungu dan tidak akan disisipkan berulang kali pada masa hadapan.
Penimbal sampah ialah senarai terpaut dua hala Apabila penimbal penuh, proses semakan sampah akan dimulakan: melintasi penimbal, melintasi semua ahli pembolehubah semasa, dan kemudian mengurangkan pengiraan semula. ahli dengan 1 (jika ahli masih Jika ia mengandungi sub-ahli, ia juga akan dilalui secara rekursif, iaitu, depth-first traversal), dan akhirnya rujukan pembolehubah semasa akan diperiksa Jika ia dikurangkan kepada 0 , ia adalah sampah. Prinsip teras algoritma ini ialah: sampah disebabkan oleh ahli yang merujuk kepada diri mereka sendiri, kemudian kurangkan rujukan kepada semua ahli Jika didapati pengiraan semula pembolehubah akhir itu sendiri menjadi 0, bermakna semua rujukannya datang darinya sendiri. ahli, iaitu di tempat lain Jika anda tidak lagi menggunakannya, maka ia adalah sampah dan perlu dikitar semula. Jika tidak, ia bermakna ia bukan sampah dan perlu dikeluarkan dari penimbal. Proses khusus adalah seperti berikut:
(1) Mula melintasi dari akar senarai terpaut penimbal, tandakan nilai semasa sebagai kelabu (tetapkan zend_refcounted_h.gc_info kepada GC_GREY), kemudian lakukan traversal pertama mendalam bagi ahli nilai semasa, kurangkan kiraan semula daripada nilai ahli sebanyak 1, dan Juga ditandakan sebagai kelabu;
(2) Berulang kali melintasi senarai terpaut penimbal dan semak sama ada rujukan nilai semasa ialah 0. Jika 0, ia bermakna ia sememangnya sampah. Tandakannya sebagai putih (GC_WHITE). Jika bukan 0, maka Ia mengecualikan kemungkinan bahawa semua rujukan datang daripada ahlinya sendiri, yang bermaksud bahawa terdapat rujukan luaran dan bukan sampah Pada masa ini, kerana langkah (1) berkurangan pengiraan semula ahli sebanyak 1, ia perlu dipulihkan dan pengiraan semula ahli dilakukan sebanyak 1 dan ditandakan dengan warna hitam (3) Lintas senarai penimbal sekali lagi dan keluarkan nod bukan GC_WHITE daripada senarai akar Pada akhirnya, semua senarai akar adalah sampah sebenar.
Pembelajaran yang disyorkan: "
Tutorial Video PHPAtas ialah kandungan terperinci Apakah maksud gc dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!