#PHP はガベージ コレクションをどのように行うのでしょうか?
php 5 と php7 における変数の実装とガベージ コレクションの比較が含まれます
変数の実装
PHP 変数は弱く型指定されており、次のことを表すことができます整数、浮動小数点数、文字列、その他の型。 PHP 変数は構造体 zval
PHP 5.* zval および zend_value 構造体
struct _zval_struct { // 结构体 zvalue_value value; zend_uint refcount__gc; zend_uchar type; zend_uchar is_ref__gc; } typedef union _zvalue_value { // 联合体 long lval; double dval; struct { char *val; int len; } str; // 字符串 HashTable *ht; // 数组 zend_object_value obj; // 对象 zend_ast *ast; } zvalue_value;
PHP 7.0 zval および zend_value 構造体
struct _zval_struct { union { zend_long lval; /* long value */ double dval; /* double value */ zend_refcounted *counted; zend_string *str; zend_array *arr; zend_object *obj; zend_resource *res; zend_reference *ref; zend_ast_ref *ast; zval *zv; void *ptr; zend_class_entry *ce; zend_function *func; struct { uint32_t w1; uint32_t w2; } ww; } value; union { struct { ZEND_ENDIAN_LOHI_4( zend_uchar type, /* active type */ zend_uchar type_flags, zend_uchar const_flags, zend_uchar reserved) /* call info for EX(This) */ } v; uint32_t type_info; } u1; union { uint32_t var_flags; uint32_t next; /* hash collision chain */ uint32_t cache_slot; /* literal cache slot */ uint32_t lineno; /* line number (for ast nodes) */ uint32_t num_args; /* arguments number for EX(This) */ uint32_t fe_pos; /* foreach position */ uint32_t fe_iter_idx; /* foreach iterator index */ } u2; };
PHP5 と PHP7 の比較によって表されます。参照カウント
php 5.* 変数代入などの操作の参照カウントは図の通り 最後から 2 番目のステップでは循環参照が形成され、設定解除操作以降はゴミが発生します生成される。
PHP 7 のカウントは特定の値に配置され、zval にはコピーオンライト (スプリットオンライト) がありません。
そして、PHP 7 には、参照を表すために使用される特別な zend_reference があります。
PHP 変数ストレージに関する上記の知識により、PHP がガベージ コレクションを行う方法を理解できます。
ガベージとは何か
まず、ガベージとは何かを定義する必要があります。
1. refcount が増加した場合、それは
2. refcount が 0 に等しい場合、直接クリアされます。
3. refcount が減少した場合、それは
ガベージ コレクション
1.php7 ではデータ型が配列とオブジェクトである必要があり、type_flag は IS_TYPE_COLLECTABLE
です。2. バッファに存在しません
3. まだマークされていません
4. 紫としてマークされ、バッファに配置されます
リサイクル アルゴリズム
論文: https://researcher.watson.ibm.com/researcher/files/us-bacon/Bacon01Concurrent.pdf
PHP バージョン 5.3 以降のバージョン
1. ルートプールにガベージを入れる
##2. 10,000 ノードに達したらガベージコレクションを実行する##3. ノード refcount-1 を二重に走査するリンク リスト
4. 二重リンク リストを走査し、refcount=0 のノードを空きキューに削除します
#5. refcount 1 の場合、refcount!=0以上がPHP はどのようにガベージ コレクション (画像とテキスト) を行うのかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。