Petunjuk pelaksanaan
1. Tambahkan penghitung referensi ke objek. Nilai penghitung referensi akan bertambah setiap saat di suatu tempat. Setiap kali referensi menjadi tidak valid, penghitungnya dikurangi satu.
Jika refcount nilai variabel dikurangi satu dan sama dengan 0 maka nilai tersebut akan dilepas dan bukan sampah. Pemulung tidak menanganinya.
Jika refcount nilai variabel lebih besar dari 0 setelah dikurangi satu, maka nilai tersebut dianggap tidak dapat dilepas dan dapat menjadi sampah.
2. Pengumpul sampah mengumpulkan kemungkinan sampah. Setelah mencapai jumlah tertentu, ia memulai program identifikasi sampah dan melepaskan sampah yang sebenarnya.
Contoh
<?php // Kasus mekanisme pengumpulan sampah PHP: lihat manual php //-----Tipe skalar----------------------------------- // tip: Setiap variabel PHP ada dalam wadah variabel bernama "zval", yang berisi jenis dan nilai variabel, "is_ref": apakah itu variabel referensi, "refcount": jumlah referensi // contoh: Buat wadah zval baru $a = 'string baru'; // contoh: menampilkan informasi kontainer zval xdebug_debug_zval('a'); // a: (refcount=1, is_ref=0),string 'string baru' (panjang=10) // contoh: Menambah jumlah referensi container zval $c = $b = $a; xdebug_debug_zval('a'); // a:(refcount=3, is_ref=0),string 'string baru' (panjang=10) xdebug_debug_zval('b'); // b:(refcount=3, is_ref=0),string 'string baru' (panjang=10) xdebug_debug_zval('c'); // c:(refcount=3, is_ref=0),string 'string baru' (panjang=10) // tip: Hanya ada satu container saat ini, karena PHP tidak akan menyalin container variabel yang dihasilkan jika tidak diperlukan // Saat ini, container variabel tersebut dikaitkan dengan variabel a, variabel b, dan variabel c. unset($b); // contoh: mengurangi jumlah referensi xdebug_debug_zval('a'); // a:(refcount=2, is_ref=0),string 'string baru' (panjang=10) // tip: unset Saat menghapus sebuah variabel, jumlah variabel refcount dikurangi satu. Saat ini, hanya $a dan $b yang menunjuk ke wadah variabel. tidak disetel($a); tidak disetel($c); var_dump($a); // tip: Saat ini, penghitungan ulang adalah 0 dan variabel dihapus // Saat penghitungan ulang menjadi 0, wadah variabel yang berisi jenis dan nilai akan dihapus dari memori. //-----Jenis komposit------------- echo '--------------Jenis komposit------------<br/>'; $a = susunan( 'nama' => 'junior', 'usia' => 18 ); xdebug_debug_zval('a'); // a:(jumlah ref=1, is_ref=0), // larik (ukuran=2) // 'nama' => (refcount=1, is_ref=0),string 'junior' (panjang=6) // 'usia' => (refcount=1, is_ref=0),int 18 // contoh: Menambahkan elemen yang ada ke array $a['love'] = $a['name']; xdebug_debug_zval('a'); // a:(jumlah ref=1, is_ref=0), // larik (ukuran=3) // 'nama' => (refcount=2, is_ref=0),string 'junior' (panjang=6) // 'usia' => (refcount=1, is_ref=0),int 18 // 'cinta' => (refcount=2, is_ref=0),string 'junior' (panjang=6) // $a = array('satu'); // xdebug_debug_zval('a'); // // $b = &$a; // $c = $a; // $b = &$c; // xdebug_debug_zval('b'); // xdebug_debug_zval('c'); // xdebug_debug_zval('a'); // Membersihkan masalah wadah variabel echo '------------Masalah kebocoran memori-----------<br/>'; $a = larik('satu'); xdebug_debug_zval('a'); // a:(jumlah ref=1, is_ref=0), // larik (ukuran=1) // 0 => (refcount=1, is_ref=0),string 'satu' (panjang=3) $a[] = &$a; xdebug_debug_zval('a'); // a:(jumlah ref=2, is_ref=1), // larik (ukuran=2) // 0 => (refcount=1, is_ref=0),string 'satu' (panjang=3) // 1 => (hitungan ulang=2, is_ref=1), // &susunan // tidak disetel($a); // (jumlah ref=1, is_ref=1)=array ( // 0 => (refcount=1, is_ref=0)='satu', // 1 => (hitungan ulang=1, is_ref=1)=... // ) // tip: Setelah tidak disetel($a), jumlah referensi dikurangi satu, meskipun tidak ada lagi simbol dalam cakupan yang menunjuk ke struktur ini (yaitu wadah variabel), // Karena elemen array "1" masih menunjuk ke array itu sendiri, container ini tidak dapat dihapus // Karena tidak ada simbol lain yang menunjuk ke sana, pengguna tidak memiliki cara untuk menghapus struktur ini, sehingga mengakibatkan kebocoran memori // Untungnya , PHP akan Struktur data ini dihapus pada akhir eksekusi skrip, tetapi banyak memori akan dikonsumsi sebelum PHP menghapusnya. // Hal yang sama terjadi pada objek, bahkan hal ini lebih mungkin terjadi pada objek karena objek selalu direferensikan secara implisit.
Di atas adalah cara penghitungan referensi PHP mengimplementasikan pengumpulan sampah. Saya harap ini dapat bermanfaat bagi semua orang.