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.
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.
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.
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:
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.
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.
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!