ホームページ  >  記事  >  バックエンド開発  >  PHP はどのようにガベージ コレクション (画像とテキスト) を行うのか

PHP はどのようにガベージ コレクション (画像とテキスト) を行うのか

angryTom
angryTom転載
2020-01-31 17:33:412631ブラウズ

PHP はどのようにガベージ コレクション (画像とテキスト) を行うのか

#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 はどのようにガベージ コレクション (画像とテキスト) を行うのか

PHP 7 のカウントは特定の値に配置され、zval にはコピーオンライト (スプリットオンライト) がありません。

そして、PHP 7 には、参照を表すために使用される特別な zend_reference があります。

PHP はどのようにガベージ コレクション (画像とテキスト) を行うのか

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 サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。