ホームページ >Java >&#&ベース >ヒープとスタックの違いは何ですか

ヒープとスタックの違いは何ですか

青灯夜游
青灯夜游オリジナル
2022-11-22 16:12:509751ブラウズ

相違点: 1. ヒープ領域は通常プログラマによって割り当ておよび解放されますが、スタック領域はオペレーティング システムによって自動的に割り当ておよび解放されます。 2. ヒープは 2 次キャッシュに格納され、ライフ サイクルは仮想マシンのガベージ コレクション アルゴリズムによって決定されますが、スタックは 1 次キャッシュを使用します。このキャッシュは、通常、呼び出されたときにストレージ領域にあります。 、通話が完了するとすぐに解放されます。 3. データ構造が異なります。ヒープはツリーとみなすことができますが、スタックは先入れ後出しのデータ構造です。

ヒープとスタックの違いは何ですか

#このチュートリアルの動作環境: Windows7 システム、Java8 バージョン、DELL G3 コンピューター。

ヒープとスタックの概念:

スタックは 2 つのデータ構造です。スタックとはデータ項目を順番に並べたデータ構造であり、データ項目の挿入と削除は一方の端(スタックの先頭と呼ばれます)でのみ可能です。マイクロコントローラー アプリケーションでは、スタックは特別な記憶領域であり、その主な機能はデータとアドレスを一時的に保存することであり、通常はブレークポイントとシーンを保護するために使用されます。重要なポイント: ヒープ、キューの優先順位、先入れ先出し (FIFO - 先入れ先出し)。スタック、先入れ後出し (FILO - 先入れ/後出し)。

ヒープとスタックの違い:

1. スタック領域割り当ての違い:

1. スタック (動作中) system) : 関数パラメータ値、ローカル変数値などを保存するために、オペレーティング システムによって自動的に割り当ておよび解放されます。その操作方法はデータ構造におけるスタックと同様であり、

2. ヒープ (オペレーティング システム): 通常、プログラマによって割り当ておよび解放されますが、プログラマが解放しない場合は、プログラマによって再利用される場合があります。プログラム終了時の OS の割り当て方法も同様です。

2. スタック キャッシュ メソッドの違い:

1. スタックは 1 次キャッシュを使用します。通常、スタックは呼び出されたときにストレージ領域にあります。呼び出しが完了した直後に解放;

2. ヒープは 2 次キャッシュに格納され、ライフ サイクルは仮想マシンのガベージ コレクション アルゴリズムによって決定されます (リサイクルできるわけではありません)。孤立オブジェクトになると)。したがって、これらのオブジェクトを呼び出す速度は比較的遅くなります。

3. スタック データ構造の違い:

ヒープ (データ構造): ヒープは次のようにツリーとみなすことができます: ヒープ ソート;

スタック (データ構造): 先入れ後出しのデータ構造。

Java のスタックとヒープ:

スタックとヒープは、Java が Ram にデータを保存するために使用する場所です。 C とは異なり、Java はスタックとヒープを自動的に管理するため、プログラマがスタックやヒープを直接設定することはできません。

関数内で定義されたいくつかの基本的なタイプの変数およびオブジェクト参照変数は、関数のスタック メモリに割り当てられます。変数がコード ブロック内で定義されると、Java はスタック上の変数にメモリ領域を割り当てます。変数のスコープを超えると、Java は変数に割り当てられたメモリ領域を自動的に解放し、メモリ領域はすぐに解放されます。他の目的に使用します。
ヒープ メモリは、new によって作成されたオブジェクトと配列を格納するために使用され、ヒープに割り当てられたメモリは、Java 仮想マシンの自動ガベージ コレクタによって管理されます。配列またはオブジェクトがヒープ内に生成された後、スタック内の変数の値がヒープ メモリ内の配列またはオブジェクトの最初のアドレスと等しくなるように、スタック内に特殊な変数を定義することもできます。スタックは配列またはオブジェクトへの参照変数になります。参照変数は、配列またはオブジェクトに名前を付けることと同じであり、スタック内の参照変数を使用して、プログラム内のヒープ内の配列またはオブジェクトにアクセスできます。

Java におけるメモリ内の変数の割り当て:

1. クラス変数 (静的に変更された変数): プログラムがロードされると、システムはそれをヒープ内で開きます。ヒープ内のメモリアドレスはスタック上に格納され、高速アクセスが可能になります。静的変数の存続期間は、「システム」全体がシャットダウンされるまで続きます。

2. インスタンス変数: Java キーワード new を使用すると、システムは変数 (クラス インスタンスなど) に必ずしも連続的ではないヒープ内の領域を割り当て、分散されたヒープ メモリ アドレスに基づいて変換されます。ハッシュ アルゴリズムを通じて長い数値文字列に変換し、ヒープ内でのこの変数の「物理的位置」を表します。インスタンス変数のライフサイクル – インスタンス変数への参照が失われると、そのインスタンス変数は GC (ガベージ コレクター) によって再利用可能な「リスト」に追加されますが、ヒープ内のメモリはすぐには解放されません。

3. ローカル変数: ローカル変数はメソッドまたは特定のコードセグメント (for ループなど) で宣言され、実行されるとスタック上にメモリが割り当てられます。スコープ、メモリはすぐに解放されます。

これには Java メモリの問題が関係します。次を参照してください:

Java のメモリ メカニズム

推奨チュートリアル: 「

java チュートリアル

以上がヒープとスタックの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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