ホームページ  >  記事  >  バックエンド開発  >  PHPのガベージコレクションとは何ですか?それはパフォーマンスにどのような影響を与えますか?

PHPのガベージコレクションとは何ですか?それはパフォーマンスにどのような影響を与えますか?

青灯夜游
青灯夜游転載
2021-07-29 18:28:072257ブラウズ

この記事では、ガベージ コレクションについて紹介し、PHP のガベージ コレクション メカニズムを簡単に分析し、最後にガベージ コレクションがパフォーマンスに与える影響について説明します。

PHPのガベージコレクションとは何ですか?それはパフォーマンスにどのような影響を与えますか?

# 開発について少しでも学んだ学生なら、どのようなプログラミング言語であっても、変数はメモリに格納されることを知っていると思います。実際、私たち開発者は常にメモリを前後に操作しています。それに応じて、新しい変数を追加し続けると、メモリは増え続けます。良いメカニズムがなければ、メモリは際限なく増加し、最終的にはメモリがいっぱいになってしまいます。これによりメモリ リークが発生します。しかし、日常の開発においては、一度に大きなファイルをロードしない限り、メモリオーバーランエラーが発生することはほとんどなく、これがガベージコレクション機構の役割です。

ガベージ コレクションとは何ですか?

C 言語を使用する場合、メモリを解放するために手動で free を使用する必要があります。C 以降のほとんどのプログラミング言語には、ガベージ コレクションなどの独自の処理機能があり、これが今日のガベージです。私たちが話している収集メカニズムは GC とも呼ばれます。 GC 機能を備えた開発言語では、メモリをいつ解放するかを気にする必要はなく、これらの言語は既にメモリを解放しているため、この部分の内容を理解する必要さえありません。最下位レベルのメモリ解放の問題。

もちろん、この分野で最も有名なコンテンツは Java のガベージ コレクション メカニズムです。実際、PHP にも対応する処理メカニズムがあります。もちろん、多くの PHPer はこれに一度も触れたことがないかもしれません。この点については後で説明します。

PHP のガベージ コレクション アルゴリズム

前回の記事では、参照カウントの概念を紹介しました。 PHP5.3 より前の PHP のガベージ コレクション メカニズムは非常に単純で、refcount が 0 のすべての項目をクリーンアップしてリサイクルするもので、最下位レベルは空きでした。しかし、この方法では、参照カウントの記事で述べた循環参照の問題が発生し、この種の参照問題は通常のrefcountの判定では再利用できません。そのため、PHP5.3 より前では、循環参照によってメモリ リークが発生していました。

私がバージョンを強調する理由は、5.3 以降、PHP がガベージ コレクション アルゴリズムを改善し、この循環参照を解決したためです。 (もちろん、私たちは日々の開発においてこの種の循環参照の問題を回避するよう努めています)。具体的なアルゴリズムについては、公式画像を引用します。

PHPのガベージコレクションとは何ですか?それはパフォーマンスにどのような影響を与えますか?

公式ドキュメントに詳細な説明がありますが、それでも非常にわかりにくいです。このプロセスを簡単な言語 (人間の言語) を使って説明しましょう。

まず、ルート バッファーという概念があります。これは図のルートです。最下位レベルでは、一連の理解できないアルゴリズムを通じて、各変数の考えられる根を見つけることができます。 PHP は、変数の可能なルートをルート バッファーに入れます。

ルート バッファーがいっぱいの場合、デフォルト値は通常 10000 です。この値を変更するには、ソース コードを変更し、再コンパイルする必要があります。 PHP はガベージ コレクション メカニズムを開始し、ルート バッファーからの深度トラバーサル アルゴリズムに従って、この可能なルートに関連するすべての変数を見つけ、特定の可能なルートによって見つかった変数の refcount を 1 減らして、マークをマークします。現在のもの。「削減」。

その後、もう一度深くトラバースし、refcount が 0 でない場合は 1 を追加し、0 の場合は変更しないでください。

次に、ルート バッファー内のすべての可能なルートを、削除ではなくクリアします。次に、refcount を 0 にしてすべての変数の内容をクリーンにして解放します。

あなたはすでに混乱していますか?実際、私も非常に混乱しています。この段落がどのように書かれたのかさえわかりません....

いくつかの重要なポイントを覚えておくだけで、面接に対処し、ほとんどの人を即座に殺すことができます。

  • PHP5.3 以降では、各変数の refcount が 0 であるかどうかを直接チェックしません。
  • 使用されるアルゴリズムは深さトラバーサルです。ルート バッファーがあり、クリーンアップされます。それによると、特定のアルゴリズムには C とアルゴリズムのしっかりした基礎が必要です。ソース コードを学習するときに注意深く学習しましょう。
  • 5.3 その後、アルゴリズムは循環参照の問題を解決しました。
  • メモリ リーク値は一定の範囲内にとどまり、すぐに大規模なクラッシュが発生することはありません

ガベージ コレクションがパフォーマンスに及ぼす影響

As前述したように、ルート バッファがいっぱいになるとガベージ コレクションが発生し、すぐに実行されます。また、深さのトラバースが 2 回行われるため、必然的にパフォーマンスの消費が生じます。結局のところ、アルゴリズムの実行には時間がかかります。ただし、メモリ オーバーフローなどの壊滅的なエラーと比較すると、ガベージ コレクションによるパフォーマンスの低下は基本的に無視できます。

概要

実のところ、ガベージ コレクションについて覚えておく必要があるのは、いくつかの重要なポイントだけです。特定のコア アルゴリズムと内容については、さらに詳しく調べる必要があります。もちろん、それは私たちの研究の目的でもありますが、将来的にはソースコードの下部にある関連する内容にも必ず手を出していきますので、しばらくお待ちください。

推奨学習: 「PHP ビデオ チュートリアル

以上がPHPのガベージコレクションとは何ですか?それはパフォーマンスにどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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