ホームページ バックエンド開発 PHPチュートリアル PHP ガベージ コレクションのリサイクル戦略とアルゴリズム

PHP ガベージ コレクションのリサイクル戦略とアルゴリズム

Jun 13, 2016 pm 12:03 PM
root unset xdebug zval

PHP ガベージ コレクションのリサイクル戦略とアルゴリズム

1. ガベージ コレクションの実装

では、以前は、参照カウント メカニズムが使用されていましたか?しかし、このメカニズムには欠点があり、循環参照によって引き起こされるメモリ リークを処理できないということです。ただし、php5.3.0 以降のバージョン (5.3.0 を含む) では、このメモリ リークの問題に対処するために、特別な GC メカニズム (同期アルゴリズム) を使用してガベージがクリーンアップされます。以下は、その実装方法の概要です:

??まず、いくつかの基本的なガイドラインを理解する必要があります:

1: zval の refcount が増加する場合、この zval はまだ使用されており、ゴミには属しません。

2: zval の refcount が 0 に減少すると、zval は解放され、ガベージになります。

3: zval の refcount が削減された後に 0 より大きい場合、zval は解放できず、zval はガベージになる可能性があります。

? ?基準 3 の場合にのみ、GC は zval を収集し、新しいアルゴリズムを使用して zval がガベージであるかどうかを判断します。では、そのような変数が本当にゴミであるかどうかを判断するにはどうすればよいでしょうか?簡単に言うと、zval の refcount が 0 の場合、zval の要素ごとに refcount が 1 ずつ減ります。この原理は非常に単純に見えますが、理解するのは簡単ではありません。構造図を通して理解してみましょう:

? GC アルゴリズムは、ガベージ判定のために呼び出されます。このアルゴリズムは、最初に前の基準 3 に該当するすべての zval ノードをノード (ルート) バッファー (ルート バッファー) に置き、同時にこれらの zval ノードを紫色にマークします。 、アルゴリズムは、各 zval ノードがバッファー内に 1 回出現することを保証する必要があります。バッファがノードでいっぱいになると、GC はバッファ内の zval ノードに対してガベージ判定を実行し始めます。

? ?B: バッファーがいっぱいになると、同じ zval の refcount が繰り返しデクリメントされないように、アルゴリズムは深さ優先で各ノードに含まれる zval を 1 つデクリメントします。 zval の refcount が 1 減ると、zval は灰色でマークされます。このステップでは、ノード zval 自体は最初は 1 ずつデクリメントされませんが、ノード zval に含まれる zval がノード zval (循環参照) を指している場合、ノード zval を 1 だけデクリメントする必要があることを強調しておく必要があります。現時点では。

? ?C: アルゴリズムは再び深さ優先で各ノードに含まれる zval の値を決定し、その refcount が 0 に等しい場合はそれを白としてマークします。 zval の が 0 より大きい場合、この zval とそれに含まれる zval の refcount が 1 だけ増加します。これは非ガベージの復元操作であり、同時にこれらの zval の色は黒に変更されます。 (zval のデフォルトの color 属性)

? ?D: zval ノードをトラバースし、C で白でマークされたノード zval を解放します。

2. ガベージ コレクション プロセスの詳細な説明と例実際の応用はどうでしょうか?以下は例を通して説明されます: ? ① 変数が宣言されて値が割り当てられたばかりのとき、それは実際には基準 1 と等価です (zval の refcount が増加しても、zval はまだ変化しません)。使用中であり、ガベージではありません)、変数はガベージではないため、GC チェックされません。

?②上記を踏まえて、unset()関数を呼び出して変数bとcを解放しました。次のように:

$a = "one";$b = array();$b[] = $a;$b[] = & $b;$c = "two";//声明了三个变量$a、$b、$c。这个时候refcount都是增加的情况,变量不是垃圾也不会放入到root缓冲器等待垃圾检查。xdebug_debug_zval( 'a' );  xdebug_debug_zval( 'b' );  xdebug_debug_zval( 'c' );  //输出分别如下:a: (refcount=2, is_ref=0)='one'b: (refcount=2, is_ref=1)=array (     0 => (refcount=2, is_ref=0)='one',     1 => (refcount=2, is_ref=1)=... )  c: (refcount=1, is_ref=0)='two'
ログイン後にコピー
?

?unset 関数を呼び出した後、$b と $c の対応するコンテナーの refcount は 1 ずつ減りますが、その効果は同じではありません。まず、unset ($c) を呼び出す $c を調べます。$c の refcount は 0 にプログラムされており、基準 2 に準拠します。次に、$c に対応する zval コンテナーはガベージであり、unset を呼び出した後に $b を調べます。 ($b) ですが、$b A 参照の最初の値は $b に対応する zval コンテナを指し続けますが、$b に対応する zval コンテナの refcount は 1 減らされ、値は 2 から に変わります。 1.このとき、コンテナの refcount は 1 減りますが、まだ 0 ではないため、基準 3 に適合し、$b に対応する zval がルート バッファに入れられます。 gc ガベージ チェック操作を待機しています。つまり、(2) の (A) の状況に入ります。

unset($b);unset($c);xdebug_debug_zval( 'a' ); //输出如下:a: (refcount=2, is_ref=0)='one'
ログイン後にコピー

? ③以降の動作は(2)のとおりです。 (2)のABCD処理を経ると、変数$bに対応するzvalコンテナが解放され、ガベージコレクションが完了し、循環参照のメモリリーク問題が解決されます。

3. ガベージコレクターの設定と使用

? PHP では、GC はデフォルトで有効になっています。ini ファイルの ?zend.enable_gc 項目を使用して GC を有効または無効にできます。 GC が有効な場合、ノード バッファ (ルート バッファ) がいっぱいになった後にガベージ分析アルゴリズムが開始されます。もちろん、バッファはデフォルトで 10,000 個の値を保持できます。PHP を再コンパイルしてリンクする必要があります。 GC がオフになると、ガベージ分析アルゴリズムは実行されませんが、この時点でバッファー ノードがいっぱいの場合、関連するノードはノード バッファーに置かれ、新しいノードは記録されません。記録されたノードはガベージ分析アルゴリズムによって分析されることはありません。これらのノードに循環参照がある場合、メモリ リークが発生する可能性があります。 GC がオフのときにこれらのノードを記録するのは、ノードが生成されるたびに GC がオンになっているかどうかを判断するよりも、単にこれらのノードを記録する方が高速であるためです。また、スクリプトの実行中に GC をオンにすることができます。したがって、これらのノードを記録します。コードの実行中のある時点で GC がオンになっている場合、これらのノードは分析アルゴリズムによって分析できます。もちろん、ガベージ分析アルゴリズムは比較的時間のかかる操作です。

??? PHP コードでは、gc_enable() 関数と gc_disable() 関数を使用して GC をオンまたはオフにすることができます。また、ノード バッファーがいっぱいでないときに gc_collect_cycles() を呼び出してガベージ分析を強制することもできます。 .アルゴリズム。このようにして、ユーザーはプログラムの特定の部分で GC をオフまたはオンにすることができ、ガベージ分析アルゴリズムを強制することもできます。 ?

?

?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

スーパーユーザーとして Ubuntu にログインします スーパーユーザーとして Ubuntu にログインします Mar 20, 2024 am 10:55 AM

Ubuntu システムでは、通常、root ユーザーは無効になっています。 root ユーザーをアクティブにするには、passwd コマンドを使用してパスワードを設定し、su-コマンドを使用して root としてログインします。 root ユーザーは、無制限のシステム管理権限を持つユーザーです。彼は、ファイルへのアクセスと変更、ユーザー管理、ソフトウェアのインストールと削除、およびシステム構成の変更を行う権限を持っています。 root ユーザーと一般ユーザーの間には明らかな違いがあり、root ユーザーはシステム内で最高の権限とより広範な制御権限を持ちます。 root ユーザーは、一般のユーザーでは実行できない重要なシステム コマンドを実行したり、システム ファイルを編集したりできます。このガイドでは、Ubuntu の root ユーザー、root としてログインする方法、および通常のユーザーとの違いについて説明します。知らせ

Nginx 設定における root ディレクティブと alias ディレクティブの違いは何ですか? Nginx 設定における root ディレクティブと alias ディレクティブの違いは何ですか? May 12, 2023 pm 12:16 PM

ルートとエイリアスの両方を location モジュールで定義でき、リクエストされたリソースの実際のパスを指定するために使用されます。たとえば、 location/i/{root/data/w3;} リクエスト http://foofish.net/i /top.gif このアドレスが使用される場合、サーバー内の対応する実際のリソースは、/data/w3/i/top.gif ファイルです。 注: 実際のパスは、root で指定された値に location で指定された値を加えたものです。そして、alias はその名前と同じです。alias で指定されたパスは location の別名です。location の値がどのように記述されても、リソースの実際のパスは、次のように alias で指定されたパスになります。

Python を使用して Windows で長いパスのファイルを段階的に削除する Python を使用して Windows で長いパスのファイルを段階的に削除する Apr 12, 2023 pm 01:31 PM

0x01 記事の背景 最近、筆者の会社の業務システムのストレージが限界に近づき、まもなくサーバーが起動できなくなります 業務システムAには複数のサブシステムA1、A2、A3…が含まれているため、これらのサブシステムの中央 設計上の理由により、保存されたファイルはすべて同じ親ディレクトリに保存されます。唯一の違いは、異なるサブシステムによって生成されたファイルとフォルダーの名前がす​​べてサブシステムの名前で始まることです。たとえば、A1 サブシステムによって生成されるファイル名はすべて A1xxxxxx で、A2 サブシステムによって生成されるファイル名はすべて A2xxxxx です。ここで、サーバーのスペースを解放するために、これらのサブシステムの一部の履歴ファイルを削除する必要があります。数十テラバイトのデータが一緒に保存されています。手動での削除は絶対に表示されません。使用できるのはプログラムの自動化だけです。

Linux で root ユーザー名を変更する方法 Linux で root ユーザー名を変更する方法 May 18, 2023 pm 07:50 PM

1. CentOS を例に挙げると、ログイン後、/etc/passwd と /etc/shadow を変更し、1 行目からの root を新しいユーザー名 (admin など) に変更し、変更後 wq! で保存します。 2. 変更して保存した後、サーバーを再起動すると有効になります。ファイルの権限を確認すると、次のようにアカウント列が admin に変更されていることがわかります: 注: Linux で最高の管理権限を持つデフォルトのユーザーはルート、uidは0です。システムでは uid のみが認識されるため、uid が 0 である限り、システムは最上位の管理ユーザーとみなされます。ただし、アプリケーションに特定の問題が発生する可能性があります。一部のソフトウェアはデフォルトで root ユーザーを使用するため、ソフトウェア アプリケーションについての理解が不十分な場合は、

携帯電話をroot化することの長所と短所 携帯電話をroot化することの長所と短所 Jul 06, 2023 pm 04:53 PM

携帯電話をルート化する利点: 1. システムをバックアップできる; 2. 高度なプログラムを使用できる; 3. システム プログラムを変更および削除できる; 4. SD カードにプログラムをインストールできる; 5. 変更できるシステムフォントなど短所: 1. 携帯電話がルート化されると、トロイの木馬ウイルスに簡単に侵入されます; 2. 不完全性やソフトウェアの互換性の問題により、システムが損傷する可能性があります; 3. 携帯電話がルート化されると、ソフトウェアがシステムファイルを誤って削除します、システムエラーを引き起こす; 4. 携帯電話をroot化した後など、ユーザーのプライバシーが漏洩する危険性があります。

運用サーバーで XDebug を有効にすると、PHP が遅くなりますか? 運用サーバーで XDebug を有効にすると、PHP が遅くなりますか? Sep 22, 2023 pm 10:41 PM

はい、XDebug のようなデバッガーは PHP サーバーのパフォーマンスを低下させる可能性があります。これが、デバッガがサーバー環境に配置されない理由です。不要なオーバーヘッドを避けるために、これらは異なる環境にデプロイされます。デバッグ メッセージは、すでに運用されているアプリケーションでは表示できません。デバッグ動作がサーバーに追加されると、デバッグ エンジンが PHP プロセスに接続されます。ブレークポイントで停止するためにメッセージの受信を開始しますが、他のプロセスにパフォーマンスに影響を与え、PHP パーサーを停止する可能性があるため、これは必須の動作ではありません。一方、デバッガーは実稼働環境での使用を目的としていないため、インストールされる場合はサーバーでポートを開く傾向があります。サーバーのポートを開くことは、ハッカーがのぞき見するためのドアを開けるのと同じくらい悪いことです。

PHP は変数をどのように保存するのでしょうか? zval構造を理解していますか? PHP は変数をどのように保存するのでしょうか? zval構造を理解していますか? May 26, 2022 am 09:47 AM

PHP で変数を定義するときに型を宣言する必要はありません。最初に変数 $a に整数値を代入し、後で他の型に簡単に変更できます。では、この変数 $a は PHP ソース コードにどのように格納されるのでしょうか?この疑問を念頭に置いて、PHP のソース コードを見てみましょう。

PHP8.0のデバッグライブラリ:Xdebug PHP8.0のデバッグライブラリ:Xdebug May 14, 2023 am 08:09 AM

デバッグは PHP 開発において避けられない部分です。開発者が独自のコードをより簡単にデバッグできるようにするために、PHP8.0 では、デバッグ ライブラリに非常に便利なツールである Xdebug が導入されました。この記事では、Xdebug の主な機能のいくつかと、Xdebug を使用して PHP デバッグのプロセスを簡素化する方法を紹介します。 Xdebug は、PHP アプリケーションのエラーをキャプチャし、詳細なエラー スタック トレース情報と使用されている変数を提供できるオープン ソースのデバッグ ツールです。開発者がコードを検出してトラブルシューティングを行うのに役立ちます

See all articles