検索
ホームページバックエンド開発PHPの問題PHP ガベージ コレクションの原理を 10 分で理解する

PHP ガベージ コレクションの原理を 10 分で理解する

Sep 04, 2019 am 09:52 AM
php原理ガベージコレクション

PHP ガベージ コレクションの原理を 10 分で理解する

php のガベージ コレクション メカニズムは、PHPer にとってよく知られていますが、あまり馴染みのない内容です。では、PHP はどのようにして不要なメモリをリサイクルするのでしょうか?

php 変数のメモリ格納構造:

まず、ガベージ コレクションの原理を理解しやすくするための基礎知識を理解する必要があります。 PHP が C で書かれていることは誰もが知っているので、PHP 変数の内部ストレージ構造も C 言語、つまり zval の構造に関連します。

struct _zval_struct {
    union {
        long lval;
        double dval;
        struct {
            char *val;
            int len;
        } str;
        HashTable *ht;
        zend_object_value obj;
    } value;                    //变量value值
    zend_uint refcount__gc;   //引用计数内存中使用次数,为0删除该变量
    zend_uchar type;           //变量类型
    zend_uchar is_ref__gc;    //区分是否是引用变量
};

の内容からわかります。各php変数は、変数の型、値の値、参照カウント数、参照変数かどうかの4つの部分で構成される上記の構造です。

注: 上記のzval構造は、php5.3バージョン以降の構造です。 php5.3 より前では、新しいものは導入されておらず、ガベージ コレクション メカニズムは GC であるため、名前は _gc; ではなく、PHP7 バージョン以降は、パフォーマンスの問題により zval 構造体が書き換えられたため、ここでは説明しません。

参照カウントの原則:

PHP 変数の内部ストレージ構造を理解した後、PHP 変数の割り当てと初期のガベージ コレクション メカニズムに関連する原則について学びます。

変数コンテナ

非配列変数とオブジェクト変数

定数が変数に代入されるたびに、変数コンテナが生成されます。

例:

$a = '许铮的技术成长之路';
xdebug_debug_zval('a')

結果:

a: (refcount=1, is_ref=0)='许铮的技术成长之路'

配列変数とオブジェクト変数

は要素番号を生成します番号 1 の変数コンテナ

例:

$b = [
'name' => '许铮的技术成长之路',
'number' => 3
];
xdebug_debug_zval('b')

結果:

b: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 
'number' => (refcount=1, is_ref=0)=3)

代入原則 (コピーオンライト テクノロジ)

定数の代入を理解したら、メモリの観点から変数間の代入を考えてみましょう

例:

$a = [
'name' => '许铮的技术成长之路',
'number' => 3
]; //创建一个变量容器,变量a指向给变量容器,a的ref_count为1
$b = $a; //变量b也指向变量a指向的变量容器,a和b的ref_count为2
xdebug_debug_zval('a', 'b');
$b['name'] = '许铮的技术成长之路1';//变量b的其中一个元素发生改变,此时会复制出一个新的变量容器,
变量b重新指向新的变量容器,a和b的ref_count变成1
xdebug_debug_zval('a', 'b');

結果:

a: (refcount=2, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3)
b: (refcount=2, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3)
a: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路', 'number' => (refcount=1, is_ref=0)=3)
b: (refcount=1, is_ref=0)=array ('name' => (refcount=1, is_ref=0)='许铮的技术成长之路1', 'number' => (refcount=1, is_ref=0)=3)

つまり、変数 a が変数 b に代入されるとき、新しい変数コンテナはすぐには生成されませんが、変数 b は変数 a が指す変数コンテナを指します、つまり、メモリが「共有」されます。これは Copy on writeTechnology

参照カウントは 0

# にクリアされます##変数コンテナのref_countが0になると変数コンテナが破棄されメモリリサイクルが実現することを意味しますこれもphp5.3以前のガベージコレクションの仕組みです

例:


$a = "许铮的技术成长之路";
$b = $a;
xdebug_debug_zval('a');
unset($b);
xdebug_debug_zval('a');

結果:


a: (refcount=2, is_ref=0)='许铮的技术成长之路'
a: (refcount=1, is_ref=0)='许铮的技术成长之路'

循環参照によるメモリ リークの問題:

しかし、これは、php5.3 より前のガベージ コレクション機構の抜け穴です。つまり、オブジェクト内の配列または子要素がその親要素を参照しており、このときにその親要素が削除された場合、この変数コンテナは削除されません。これは、その子要素がまだ変数コンテナを指しているためですが、変数コンテナを指しているシンボルはクリアできないため、スクリプトの実行が終了するまでメモリ リークが発生します。

例:


$a = array( 'one' );
$a[] = &$a;
xdebug_debug_zval( 'a' );

この例では出力が適切ではないため、次の図に示すようにグラフィカル表現を使用します。

PHP ガベージ コレクションの原理を 10 分で理解する

例:

unset($a);
xdebug_debug_zval('a');

図に示すように:


PHP ガベージ コレクションの原理を 10 分で理解する

新しいガベージ コレクション メカニズム:

ルート バッファー メカニズムは、php のバージョン 5.3 以降に導入されました。つまり、php が開始されると、指定された数の zval を持つルート バッファーがデフォルトで設定されます (デフォルトは 10000)。php が循環参照 zval があることを検出すると、それがルート バッファーに置かれます。バッファが構成ファイルで指定された数 (デフォルトは 10000) に達すると、循環参照によるメモリ リークの問題を解決するためにガベージ コレクションが実行されます。

ガベージであることを確認する基準:

1. 参照カウントがゼロに減らされた場合、変数コンテナはクリア (解放) され、ガベージではなくなります。

2. zval の参照カウントが減らされても、依然として より大きい場合0 の場合、ガベージ サイクルに入ります。次に、ガベージ サイクル中に、参照カウントが 1 減らされているかどうかを確認し、どの変数コンテナの参照が 0 であるかを確認して、どの部分がガベージであるかを見つけます。

概要:

ガベージ コレクション メカニズム:

1. php の参照カウント メカニズムに基づいています (php5.3 より前ではこのメカニズムのみが利用可能でした)
2 、ルート バッファ メカニズムを同時に使用します。PHP は、循環参照を持つ zval があることを検出すると、それをルート バッファに置きます。ルート バッファが設定ファイルで指定された数に達すると、ガベージ コレクションが実行されます。循環参照によって引き起こされるメモリ リークの問題を解決する (php5.3 でこのメカニズムが導入され始めました)

その他の関連する質問については、PHP 中国語 Web サイトを参照してください:

php ビデオ チュートリアル

以上がPHP ガベージ コレクションの原理を 10 分で理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
酸とベースデータベース:違いとそれぞれを使用するタイミング。酸とベースデータベース:違いとそれぞれを使用するタイミング。Mar 26, 2025 pm 04:19 PM

この記事では、酸とベースのデータベースモデルを比較し、その特性と適切なユースケースを詳述しています。酸は、財務およびeコマースアプリケーションに適したデータの整合性と一貫性を優先し、ベースは可用性に焦点を当て、

PHPセキュアファイルアップロード:ファイル関連の脆弱性の防止。PHPセキュアファイルアップロード:ファイル関連の脆弱性の防止。Mar 26, 2025 pm 04:18 PM

この記事では、コードインジェクションのような脆弱性を防ぐために、PHPファイルのアップロードを確保することについて説明します。ファイルタイプの検証、セキュアストレージ、およびアプリケーションセキュリティを強化するエラー処理に焦点を当てています。

PHP入力検証:ベストプラクティス。PHP入力検証:ベストプラクティス。Mar 26, 2025 pm 04:17 PM

記事では、組み込み関数、ホワイトリストアプローチ、サーバー側の検証などの手法に焦点を当てたセキュリティを強化するためのPHP入力検証のベストプラクティスについて説明します。

PHP APIレート制限:実装戦略。PHP APIレート制限:実装戦略。Mar 26, 2025 pm 04:16 PM

この記事では、Token BucketやLeaky BucketなどのアルゴリズムやSymfony/Rate-Limiterなどのライブラリを使用するなど、PHPでAPIレート制限を実装するための戦略について説明します。また、監視、動的に調整されたレートの制限、および手をカバーします

PHPパスワードハッシュ:password_hashおよびpassword_verify。PHPパスワードハッシュ:password_hashおよびpassword_verify。Mar 26, 2025 pm 04:15 PM

この記事では、パスワードを保護するためにPHPでpassword_hashとpassword_verifyを使用することの利点について説明します。主な議論は、これらの関数が自動塩の生成、強力なハッシュアルゴリズム、およびSecurを通じてパスワード保護を強化するということです

OWASPトップ10 PHP:共通の脆弱性を説明し、軽減します。OWASPトップ10 PHP:共通の脆弱性を説明し、軽減します。Mar 26, 2025 pm 04:13 PM

この記事では、PHPおよび緩和戦略におけるOWASPトップ10の脆弱性について説明します。重要な問題には、PHPアプリケーションを監視および保護するための推奨ツールを備えたインジェクション、認証の壊れ、XSSが含まれます。

PHP XSS予防:XSSから保護する方法。PHP XSS予防:XSSから保護する方法。Mar 26, 2025 pm 04:12 PM

この記事では、PHPでのXSS攻撃を防ぐための戦略について説明し、入力の消毒、出力エンコード、セキュリティを向上させるライブラリとフレームワークの使用に焦点を当てています。

PHPインターフェイスvs抽象クラス:それぞれを使用する時期。PHPインターフェイスvs抽象クラス:それぞれを使用する時期。Mar 26, 2025 pm 04:11 PM

この記事では、PHPでのインターフェイスと抽象クラスの使用について説明し、それぞれをいつ使用するかに焦点を当てています。インターフェイスは、無関係なクラスや複数の継承に適した、実装なしで契約を定義します。抽象クラスは共通の機能を提供します

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境