Ketahui lebih lanjut tentang mekanisme pengumpulan sampah PHP

WBOY
Lepaskan: 2023-03-16 18:50:01
ke hadapan
1823 orang telah melayarinya

(Tutorial yang disyorkan: Tutorial video PHP)

1. Pengetahuan asas pengiraan rujukan

Setiap php Pembolehubah disimpan dalam bekas berubah yang dipanggil zval.

Bekas pembolehubah zval, selain mengandungi jenis dan nilai pembolehubah, ia juga termasuk dua bait maklumat tambahan.

Yang pertama ialah is_ref, iaitu nilai bool yang digunakan untuk mengenal pasti sama ada pembolehubah ini tergolong dalam koleksi rujukan. Melalui bait ini, enjin PHP boleh membezakan pembolehubah biasa daripada pembolehubah rujukan Memandangkan PHP membenarkan pengguna menggunakan rujukan tersuai dengan menggunakan &, terdapat juga mekanisme pengiraan rujukan dalaman dalam bekas pembolehubah zval untuk mengoptimumkan penggunaan memori.

Bait tambahan kedua ialah pengiraan semula, yang mewakili bilangan pembolehubah yang menunjuk ke bekas pembolehubah zval ini.

Semua simbol wujud dalam jadual simbol, di mana setiap simbol mempunyai skop, begitu juga dengan skrip utama (contohnya: skrip yang diminta melalui penyemak imbas) dan setiap fungsi atau kaedah.

2. Hasilkan bekas zval

Apabila pembolehubah diberikan nilai malar, bekas pembolehubah zval akan dijana

Jika Xdebug dipasang, anda boleh menggunakan xdebug_debug_zval() Lihat kedua-dua ini

<?php
$a = "new string";
xdebug_debug_zval(&#39;a&#39;);
 
//结果
a: (refcount=1, is_ref=0)=&#39;new string&#39;
Salin selepas log masuk

3 Meningkatkan bilangan rujukan zval

Menetapkan satu pembolehubah kepada pembolehubah lain akan meningkatkan bilangan rujukan

<?php
$a = "new string";
$b = $a;
xdebug_debug_zval( &#39;a&#39; );
 
//结果
a: (refcount=2, is_ref=0)=&#39;new string&#39;
Salin selepas log masuk

4. Kurangkan bilangan rujukan zval

Gunakan unset() untuk mengurangkan bilangan rujukan

Bekas pembolehubah yang mengandungi jenis dan nilai akan dipadamkan daripada memori

<?php
$a = "new string";
$c = $b = $a;
xdebug_debug_zval( &#39;a&#39; );
unset( $b, $c );
xdebug_debug_zval( &#39;a&#39; );
 
//结果
a: (refcount=3, is_ref=0)=&#39;new string&#39;
a: (refcount=1, is_ref=0)=&#39;new string&#39;
Salin selepas log masuk

5 . Jenis komposit Bekas zval

  • berbeza daripada nilai jenis skalar
  • Pembolehubah jenis tatasusunan dan objek menyimpan ahli atau atributnya dalam jadual simbolnya sendiri
  • Ini bermakna contoh berikut akan menghasilkan tiga bekas pembolehubah zval
  • Tiga bekas pembolehubah zval ialah: a, makna dan nombor

<?php
$a = array( &#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42 );
xdebug_debug_zval( &#39;a&#39; );
 
//结果
a: (refcount=1, is_ref=0)=array (
   &#39;meaning&#39; => (refcount=1, is_ref=0)=&#39;life&#39;,
   &#39;number&#39; => (refcount=1, is_ref=0)=42
)
Salin selepas log masuk

6. Tingkatkan bilangan rujukan jenis komposit

Tambahkan elemen sedia ada pada tatasusunan

<?php
$a = array( &#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42 );
$a[&#39;life&#39;] = $a[&#39;meaning&#39;];
xdebug_debug_zval( &#39;a&#39; );
 
//结果
a: (refcount=1, is_ref=0)=array (
   &#39;meaning&#39; => (refcount=2, is_ref=0)=&#39;life&#39;,
   &#39;number&#39; => (refcount=1, is_ref=0)=42,
   &#39;life&#39; => (refcount=2, is_ref=0)=&#39;life&#39;
)
Salin selepas log masuk

7

Memadamkan elemen dalam tatasusunan

adalah serupa dengan memadamkan pembolehubah daripada skop.

Selepas pemadaman, bekas yang menempatkan elemen dalam tatasusunan "refcount " nilai menurun

<?php
$a = array( &#39;meaning&#39; => &#39;life&#39;, &#39;number&#39; => 42 );
$a[&#39;life&#39;] = $a[&#39;meaning&#39;];
unset( $a[&#39;meaning&#39;], $a[&#39;number&#39;] );
xdebug_debug_zval( &#39;a&#39; );
 
//结果
a: (refcount=1, is_ref=0)=array (
   &#39;life&#39; => (refcount=1, is_ref=0)=&#39;life&#39;
)
Salin selepas log masuk

8. Kes khas

Apabila kita menambah tatasusunan itu sendiri sebagai elemen tatasusunan ini, perkara menjadi menarik

Sama seperti di atas, Panggilan tidak ditetapkan pada pembolehubah akan memadamkan simbol, dan bilangan rujukan dalam bekas pembolehubah yang ditunjukkannya juga akan dikurangkan sebanyak 1

<?php
$a = array( &#39;one&#39; );
$a[] = &$a;
xdebug_debug_zval( &#39;a&#39; );
 
//结果
a: (refcount=2, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)=&#39;one&#39;,
   1 => (refcount=2, is_ref=1)=...
)
Salin selepas log masuk

9 bekas berubah-ubah

Walaupun tiada lagi sebarang simbol dalam skop yang menunjuk kepada struktur ini (iaitu, bekas berubah), memandangkan elemen tatasusunan "1" masih menunjuk kepada tatasusunan itu sendiri, bekas ini tidak boleh dikosongkan .

Oleh kerana tiada simbol lain yang menunjuk kepadanya, pengguna tidak mempunyai cara untuk mengosongkan struktur ini, mengakibatkan kebocoran memori.

Nasib baik, PHP akan mengosongkan struktur data ini pada penghujung pelaksanaan skrip, tetapi sebelum PHP mengosongkannya, ia akan menggunakan banyak memori.

Tidak mengapa jika situasi di atas berlaku hanya sekali atau dua kali, tetapi jika kebocoran ingatan berlaku beribu-ribu atau bahkan ratusan ribu kali, ini jelas menjadi masalah besar

Kitaran kitar semula

Mekanisme memori pengiraan rujukan yang digunakan oleh PHP pada masa lalu tidak dapat menangani kebocoran memori rujukan bulat

Tetapi dalam PHP 5.3.0, algoritma penyegerakan digunakan untuk menangani masalah kebocoran memori ini

Jika jumlah rujukan ditambah, ia akan terus digunakan dan sudah tentu tidak lagi di dalam sampah.

Jika kiraan rujukan berkurangan kepada sifar, bekas berubah-ubah akan dikosongkan

Maksudnya, kitaran sampah hanya akan berlaku apabila kiraan rujukan berkurangan kepada nilai bukan sifar

Dalam kitaran sampah, ketahui bahagian mana yang merupakan sampah dengan menyemak sama ada kiraan rujukan dikurangkan sebanyak 1 dan menyemak bekas pembolehubah yang mempunyai rujukan sifar

sepuluh 1 . Analisis algoritma kitar semula

Untuk mengelakkan daripada perlu menyemak semua kiraan rujukan, kemungkinan kitaran sampah dikurangkan

Algoritma ini meletakkan semua kemungkinan akar (akar yang mungkin adalah bekas pembolehubah zval) dalam penimbal akar (ditandai dengan ungu, dipanggil sampah yang disyaki), supaya setiap kemungkinan sampah dapat dipastikan pada masa yang sama Akar (kemungkinan akar sampah) muncul sekali sahaja dalam penimbal. Pengumpulan sampah dilakukan pada semua bekas berubah yang berbeza dalam penimbal hanya apabila penimbal akar penuh. Lihat langkah A dalam imej di atas.

Dalam langkah B, simulasi pemadaman setiap pembolehubah ungu. Apabila mensimulasikan pemadaman, kiraan rujukan pembolehubah biasa yang tidak berwarna ungu mungkin dikurangkan sebanyak "1". Setiap pembolehubah hanya boleh disimulasikan dipadam sekali, dan ditandakan dengan kelabu selepas pemadaman simulasi

Dalam langkah C, simulasi memulihkan setiap pembolehubah ungu. Pemulihan adalah bersyarat Apabila kiraan rujukan pembolehubah lebih besar daripada 0, pemulihan simulasi dilakukan. Begitu juga, setiap pembolehubah hanya boleh dipulihkan sekali Selepas pemulihan, ia ditandakan sebagai hitam Pada asasnya adalah operasi songsang bagi langkah B. Dengan cara ini, longgokan nod biru yang tidak boleh dipulihkan ialah nod biru yang harus dipadamkan dalam langkah D dan benar-benar padamkannya

12. Pertimbangan prestasi

Terdapat dua yang utama. Domain mempunyai kesan ke atas prestasi

Yang pertama ialah penjimatan ruang memori

Yang lain ialah peningkatan dalam masa yang diperlukan untuk mekanisme kutipan sampah melepaskan memori yang bocor

Tiga belas. Kesimpulan mekanisme kutipan sampah

Mekanisme kutipan sampah dalam PHP hanya akan meningkatkan penggunaan masa apabila algoritma kitar semula sebenarnya berjalan. Tetapi dalam skrip biasa (lebih kecil) seharusnya tiada kesan prestasi sama sekali.

Walau bagaimanapun, dalam kes skrip biasa dengan mekanisme kitar semula berjalan, penjimatan memori akan membolehkan lebih banyak skrip sedemikian dijalankan pada pelayan anda pada masa yang sama. Kerana jumlah memori yang digunakan belum mencapai had atas.

Faedah ini amat ketara dalam skrip jangka panjang, seperti suite ujian jangka panjang atau skrip daemon.

(Tutorial disyorkan: Tutorial video PHP)

Atas ialah kandungan terperinci Ketahui lebih lanjut tentang mekanisme pengumpulan sampah PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
php
sumber:jb51.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan