メモリの複数の領域に分割されます
1、スタック領域 (スタック) - コンパイラによって決定されます。プログラムが実行中です。 自動割り当て、関数パラメータ値、ローカル変数値などの保存。 その動作はデータ構造のスタックに似ています。プログラム終了時にコンパイラによって自動的に解放されます。 (推奨学習: PHP ビデオ チュートリアル )
2. ヒープ領域 (ヒープ) - メモリ内に別の記憶領域を開きます。 通常、プログラマによって割り当ておよび解放されますが、プログラマが解放しない場合は、プログラム終了時に OS によって再利用される可能性があります。ヒープとはデータ構造が違うので注意してください、割り当て方法はリンクリストに似ています(笑)。 malloc、calloc、realloc などの関数を使用してメモリを割り当てます。割り当てられるのは、ヒープ上の
3、グローバル領域 (静的領域) (静的) です。コンパイラはコンパイル時にメモリを割り当てます。 グローバル変数と静的変数は一緒に保存されます。 C 言語の場合、初期化されたグローバル変数とスタティック変数が 1 つの領域に配置され、初期化されていないグローバル変数と初期化されていないスタティック変数が隣接する別の領域に配置されます。しかし、C にはこの違いはありません。プログラム終了後にシステムによって解放されます。
4, リテラル定数領域 - 定数文字列がここに配置されます。 プログラム終了後にシステムによって解放されます
5, プログラムコード領域 - 関数本体のバイナリコードが格納されます。
C 言語でプログラミングする場合、開発者は手動でメモリを管理する必要があります。 PHP は Web サーバーのモジュールとしてよく使用されるため、メモリ管理はメモリ リークの防止と密接に関係しています。
PHP はスレッド環境で使用される可能性があることにも注意してください。つまり、グローバル変数が競合状態を引き起こす可能性があります。スレッド内でのグローバル データ処理の詳細については、「スレッド分離機能としてのスレッドセーフ リソース マネージャー」を参照してください。
さらに、Zend エンジンは非常に特殊な使用パターンに直面する必要があります。比較的短期間に、多くの zval 構造サイズのメモリ ブロックとその他の小さなメモリ ブロックが適用されてから解放されます。 PHP のメモリ管理では、memory_limit (メモリ制限) も非常に重要視されます。
注: C 標準ライブラリの同様の部分とは異なり、要求されたメモリの割り当てにエラーがあった場合、Zend エンジンのメモリ管理関数は NULL 値を返しませんが、飛び出して現在のリクエストを中止します。
上で述べたように、メモリ リークを防止し、すべてのメモリをできるだけ早く解放することは、メモリ管理の重要な部分です。セキュリティ上の理由から、Zend エンジンはリクエストの終了時に、上記の API によって割り当てられたすべてのメモリを解放します。 PHP が --enable-debug 構成オプションを使用してビルドされている場合、これにより警告が生成されます。
PHP リーク アラーム
ZEND_FUNCTION(leak) { long leakbytes = 3; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &leakbytes) == FAILURE) { return; } emalloc(leakbytes); }
以上がPHP メモリのいくつかの領域の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。