Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah pengumpulan sampah dalam PHP? Apakah kesannya terhadap prestasi?

Apakah pengumpulan sampah dalam PHP? Apakah kesannya terhadap prestasi?

青灯夜游
青灯夜游ke hadapan
2021-07-29 18:28:072319semak imbas

Artikel ini akan memperkenalkan anda kepada kutipan sampah, menganalisis secara ringkas mekanisme kutipan sampah dalam PHP, dan akhirnya bercakap tentang kesan kutipan sampah terhadap prestasi.

Apakah pengumpulan sampah dalam PHP? Apakah kesannya terhadap prestasi?

Saya percaya bahawa pelajar yang telah mempelajari serba sedikit tentang pembangunan tahu bahawa tanpa mengira sebarang bahasa pengaturcaraan, pembolehubah akan disimpan dalam ingatan. Sebenarnya, kami pembangun sentiasa memanipulasi memori ke belakang dan sebagainya, jika kami terus menambah pembolehubah baru, memori akan terus meningkat Jika tidak ada mekanisme yang baik, maka memori akan meningkat tanpa had dan akhirnya menjadi penuh. Ini menyebabkan kebocoran ingatan. Tetapi dalam pembangunan harian, melainkan jika fail besar dimuatkan pada satu masa, kita hampir tidak pernah melihat ralat overrun memori Ini adalah peranan mekanisme pengumpulan sampah.

Apakah pengumpulan sampah?

Apabila menggunakan bahasa C, kita perlu menggunakan percuma secara manual untuk melepaskan memori Kebanyakan bahasa pengaturcaraan selepas C akan mempunyai keupayaan pemprosesan mereka sendiri seperti pengumpulan sampah, iaitu apa yang kita ada hari ini The garbage. mekanisme pengumpulan yang kita bicarakan juga dipanggil GC. Dalam bahasa pembangunan dengan keupayaan GC, kita tidak perlu mengambil berat tentang masa untuk melepaskan memori, malah kita tidak perlu memahami kandungan bahagian ini sama sekali, kerana bahasa-bahasa ini telah mengendalikan isu pelepasan memori untuk kami di peringkat bawah.

Sudah tentu, kandungan yang paling terkenal di kawasan ini ialah mekanisme pengumpulan sampah di Jawa Malah, PHP juga mempunyai mekanisme pemprosesan yang sepadan, ramai PHP mungkin tidak pernah terdedah kepadanya akan membincangkan aspek ini.

Algoritma kutipan sampah PHP

Dalam artikel sebelum ini, kami telah memperkenalkan konsep pengiraan rujukan. Sebelum PHP5.3, mekanisme kutipan sampah PHP adalah sangat mudah, iaitu membersihkan dan mengitar semula semua item dengan kiraan semula 0, yang percuma di peringkat bawah. Tetapi kaedah ini akan membawa masalah, iaitu rujukan pekeliling yang kami nyatakan dalam artikel tentang pengiraan rujukan Masalah rujukan seperti ini tidak boleh dikitar semula melalui pertimbangan pengiraan biasa. Jadi sebelum PHP5.3, rujukan bulat akan menyebabkan kebocoran memori.

Sebab mengapa saya menekankan versi adalah kerana selepas 5.3, PHP menambah baik algoritma kutipan sampah dan menyelesaikan rujukan pekeliling ini. (Sudah tentu, kami cuba mengelakkan masalah rujukan pekeliling seperti ini dalam pembangunan harian). Untuk algoritma khusus, kami memetik gambar rasmi:

Apakah pengumpulan sampah dalam PHP? Apakah kesannya terhadap prestasi?

Terdapat penjelasan terperinci dalam dokumen rasmi, tetapi ia masih membuat anda keliru. Mari kita gunakan bahasa mudah (bahasa manusia) untuk menerangkan proses ini.

Pertama sekali, kami mempunyai konsep root buffer iaitu akar dalam gambar. Di peringkat bawah, melalui satu siri algoritma yang tidak dapat difahami, kita boleh mencari punca yang mungkin bagi setiap pembolehubah. PHP akan meletakkan kemungkinan punca pembolehubah ke dalam penimbal akar.

Apabila penimbal akar penuh, nilai lalai biasanya 10000. Anda perlu mengubah suai kod sumber dan menyusun semula untuk mengubah suai nilai ini. PHP akan memulakan mekanisme pengumpulan sampah, mencari semua pembolehubah yang berkaitan dengan kemungkinan akar ini daripada penimbal akar mengikut algoritma traversal kedalaman, dan mengurangkan pengiraan semula pembolehubah yang ditemui oleh punca kemungkinan tertentu sebanyak 1, dan membuat tanda untuk menandakan yang sekarang "Dikurangkan".

Kemudian rentas kedalaman semula Jika kiraan semula bukan 0, tambah 1. Jika 0, pastikan ia tidak berubah.

Kemudian kosongkan semua akar yang mungkin dalam penimbal akar, kosongkan dan bukannya padam. Kemudian bersihkan dan lepaskan semua kandungan berubah dengan kiraan semula 0.

Adakah anda sudah keliru? Malah, saya sangat keliru sehingga saya tidak tahu bagaimana perenggan ini ditulis....

Hanya ingat beberapa perkara penting dan anda boleh mengendalikan temu bual dan membunuh kebanyakan orang serta-merta.

  • Selepas PHP5.3, kami tidak menyemak secara langsung sama ada pengiraan semula setiap pembolehubah ialah 0.
  • Algoritma yang digunakan ialah depth traversal Terdapat penimbal akar, dan ia adalah dibersihkan mengikutnya. Algoritma khusus memerlukan asas yang kukuh dalam C dan algoritma Sila kaji dengan teliti apabila mempelajari kod sumber
  • 5.3 dan algoritma kemudiannya menyelesaikan masalah rujukan bulatan
  • The. nilai kebocoran memori akan kekal dalam julat tertentu , tidak akan berlaku kemalangan besar-besaran serta-merta

Kesan kutipan sampah terhadap prestasi

Seperti yang dinyatakan sebelum ini , kutipan sampah berlaku selepas penimbal akar penuh Ia akan dilaksanakan serta-merta. Terdapat juga dua traversal mendalam, yang pasti membawa kepada penggunaan prestasi. Lagipun, pelaksanaan algoritma mengambil masa. Walau bagaimanapun, berbanding dengan ralat yang memusnahkan seperti limpahan memori, kehilangan prestasi yang disebabkan oleh kutipan sampah pada asasnya boleh diabaikan.

Ringkasan

Malah, kami hanya perlu mengingati beberapa perkara penting tentang pengumpulan sampah dan kandungan teras khusus perlu dikaji dengan lebih mendalam hanya dapat memahaminya sepenuhnya selepas membaca kod sumber Sudah tentu, ini juga merupakan matlamat kajian kami. Kami pasti akan terlibat dalam kandungan asas kod sumber pada masa hadapan, jadi mari kita tunggu dan lihat!

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Apakah pengumpulan sampah dalam PHP? Apakah kesannya terhadap prestasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam