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

angryTom
リリース: 2019-11-13 14:32:20
オリジナル
4323 人が閲覧しました

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

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

ヒープとスタックについて話す前に、JVM (仮想マシン) メモリ分割:

Java プログラムは実行中にスペースを割り当てる必要があります。どのソフトウェアも実行中にメモリにスペースを割り当てる必要があります。Java 仮想マシンも実行中にスペースを割り当てる必要があります。 JVM は、実行中にメモリ内のメモリ領域を開き、起動時にそれを独自のメモリ領域にさらに慎重に分割します。仮想マシン内の各メモリは異なる方法で処理されるため、個別に管理する必要があります。 。

JVM メモリは 5 つの部分に分割されています:

1. レジスタ;

2. ローカル メソッド領域;

3. メソッド領域;

4. スタック メモリ;

5. ヒープ メモリ。

ヒープとスタックに焦点を当てましょう:

スタック メモリ: スタック メモリは、まず第一に、ローカル変数を格納するメモリ領域であり、すべてメソッドで定義されています。ローカル変数 (メソッド外部のグローバル変数)。ローカル変数は for ループ内でも定義されます。ローカル変数を定義するには、まず関数をロードする必要があります。したがって、メソッドは最初にスタックをスタックし、次に変数を定義します。変数には次のような特徴があります。独自のスコープ。変数はスコープを出ると解放されます。ローカル変数のライフサイクルが短いため、スタック メモリは非常に迅速に更新されます。

ヒープ メモリ: 配列とオブジェクトを格納します (実際、配列はオブジェクトです)。new によって作成されたものはすべてヒープにあります。エンティティ (オブジェクト) はヒープに格納されます。エンティティはデータをカプセル化するために使用され、それは複数(エンティティの複数の属性)をカプセル化します。データが 1 つ消えても、エンティティは消えずに引き続き使用できるため、いつでもヒープが解放されることはありませんが、スタックは異なります。スタックには 1 つのデータのみが保存されます。単一の変数。変数が解放されると、その変数は失われます。ヒープ内のエンティティは解放されませんが、ガベージとして扱われます。Java には、それらを随時収集するガベージ コレクション メカニズムがあります。

ヒープとスタックについて、図を使って詳しく説明します。

たとえば、main 関数のステートメント int [] arr=new int [3] ; メモリ内 定義方法:

main 関数は、最初にスタックに行き、スタック内の変数 arr を定義し、次に arr に値を代入しますが、右側は特定の値ではありませんが、実体。エンティティはヒープ上に作成されます。まず new キーワードによりヒープ内に空間が開かれます。メモリにデータが格納されるとアドレスに反映されます。アドレスは連続したバイナリであり、次にメモリアドレスが割り当てられます。実体。配列にはインデックスがあり、ヒープメモリ上に配列実体が生成された後、各空間はデフォルトで初期化されます(これはヒープメモリの特性です。初期化されていないデータは使用できませんが、ヒープ内では使用できます。初期化されているがスタック上にない場合)、型が異なれば初期化値も異なります。したがって、変数とエンティティはヒープとスタックに作成されます。

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

ヒープとスタックはどのように接続されているのでしょうか?

ヒープにアドレスを割り当て、ヒープのアドレスを arr に割り当て、arr がそのアドレスを介して配列を指すと述べました。そのため、arr が配列を操作したいときは、エンティティを直接割り当てるのではなく、アドレスを使用します。これを基本データ型ではなく、参照データ型と呼びます。これは arr と呼ばれ、ヒープ メモリ内のエンティティを参照します。 (c または c へのポインタとして理解できます。Java は c から生まれ、c に非常に似ており、c を最適化しています)

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

If when int [] arr=null ;

arr は何も指していません。null の機能は、データ型のポインタを逆参照することです。

エンティティが参照データ型によって指されていない場合、エンティティはヒープメモリに解放されませんが、Java には自動リサイクル機構があるため、ガベージとして扱われ、不定期に自動的にリサイクルされます。 . , (c はそうではありませんが、プログラマは手動でリサイクルする必要があります。リサイクルされないと、ヒープがいっぱいになるまで増大し、メモリがオーバーフローするため、Java はメモリ管理において c よりも優れています)。自動リサイクル機構(プログラム)はヒープ内にゴミがあるかどうかを自動的に監視し、ゴミがある場合は自動的にガベージコレクションを実行しますが、いつ回収されるかはわかりません。

したがって、ヒープとスタックの違いは明らかです:

1. スタック メモリはローカル変数を格納し、ヒープ メモリはエンティティを格納します;

2.スタック メモリの更新速度は、ローカル変数のライフ サイクルが非常に短いため、ヒープ メモリよりも高速です;

3. スタック メモリに格納された変数は、ライフ サイクルが終了すると解放されますが、エンティティはヒープ メモリに保存されたデータは解放され、ガベージ コレクション メカニズムによって随時収集されます。

php 中国語 Web サイト、無料の Java 入門チュートリアル が多数あり、オンラインで学習することを歓迎します。

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!