web-dev-qa-db-ja.com

メモリヒープとは何ですか?

メモリヒープとは何ですか?

140
H4cKL0rD

おそらく、データ構造の観点からではなく、メモリ割り当ての観点からheapを意味します(この用語には複数の意味があります)。

非常に簡単な説明は、heap動的に割り当てられたメモリが存在するメモリの部分(つまりmallocを介して割り当てられたメモリ。ヒープから割り当てられたメモリは、次のいずれかが発生するまで割り当てられたままになります。

  1. メモリはfree 'dです
  2. プログラムは終了します

割り当てられたメモリへのすべての参照が失われた場合(たとえば、それへのポインタをもう保存しない場合)、memory leakと呼ばれるものがあります。これはまだメモリが割り当てられている場所ですが、もう簡単にアクセスする方法はありません。リークしたメモリは、将来のメモリ割り当てのために再利用できませんが、プログラムが終了すると、メモリはオペレーティングシステムによって解放されます。

これを、ローカル変数(メソッド内で定義されたもの)が存在するstackメモリと比較してください。スタックに割り当てられたメモリは、通常、関数が戻るまで存続します(これにはいくつかの例外があります(静的ローカル変数など)。

ヒープの詳細については、 この記事 をご覧ください。

191

メモリheapは、ランダムアクセスでメモリが割り当てられるメモリ内の場所です。
stackとは異なり、メモリは非常に定義された順序で割り当ておよび解放され、個々のデータ要素はヒープは通常、互いに非同期の方法で解放されます。そのようなデータ要素は、プログラムが対応するポインタを明示的に解放すると解放され、これによりヒープが断片化される場合があります。反対側では、最上部(またはスタックの動作方法に応じて最下部)のデータのみが解放され、データ要素は割り当てられた逆の順序で解放されます。

13
mjv

メモリヒープは、動的に割り当てられたメモリを保持するための一般的な構造です。ウィキペディアの Dynamic_memory_allocation を参照してください。

プール、スタック、パイルのような他の構造があります。

7
Justicle

ヒープは、メモリが順序なしで割り当てまたは割り当て解除される単なる領域です。これは、new演算子などを使用してオブジェクトを作成するときに発生します。これは、メモリが先入れ先出し方式で割り当て解除されるスタックとは対照的です。

6
fastcodejava

おそらくメモリヒープではなく、ヒープメモリを意味します。

ヒープメモリは基本的に、実行中のプログラムがチャンクを要求できるメモリの大きなプール(通常はプロセスごと)です。通常、これは 動的割り当て と呼ばれます。

「自動変数」が割り当てられるスタックとは異なります。そのため、たとえば、C関数でポインタ変数を定義すると、メモリアドレスを保持するのに十分なスペースがスタックに割り当てられます。ただし、ヒープ上に(mallocを使用して)動的にスペースを割り当て、このメモリチャンクが開始するアドレスをポインターに提供する必要があります。

6
Uri

これは、プロセスで使用中のメモリマネージャーによってオペレーティングシステムから割り当てられたメモリの塊です。 malloc()などへの呼び出しは、オペレーティングシステムを直接処理する代わりに、このヒープからメモリを取得します。

ヒープは、コンパイル前に一定のサイズに設定されていないメモリのセグメントであり、プログラマーが動的に制御できます。ヒープは、アプリケーションの実行時に使用できるメモリの「空きプール」と考えてください。アプリケーションのヒープのサイズは、RAM(ランダムアクセスメモリ)の物理的制約によって決定され、通常はスタックよりもはるかに大きくなります。

プログラムでデータ構造がどれだけのスペースを占有するかわからない場合、スタックで使用可能なメモリよりも多くのメモリを割り当てる必要がある場合、または期間が続く変数を作成する必要がある場合は、ヒープのメモリを使用しますアプリケーションの。

0