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

PHPz
リリース: 2023-05-16 21:32:27
転載
939 人が閲覧しました

Java プログラムの実行方法

Java プログラムは Java 仮想マシン (JVM) で実行されます。JVM は、Java アプリケーションの実行時に必要なリソースのマネージャーを提供します。これは、JVM がこれらのリソースを提供できない限り、開発者によって作成または作成されたアプリケーションは、システム リソース (ハードウェアまたはソフトウェア) を直接取得する機能がないことを意味します。したがって、Java では、プログラムの実行シーケンスは次のとおりです:

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

JVM 層により、Java プラットフォームは独立して実行できますが、C/C などの他のプログラミング言語は独立して実行できません。 JVM 層に類似したものを使用するため、移植可能な言語であっても、クロスプラットフォーム言語ではありません。

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

# どちらの形式にも長所と短所があり、Java にはすでに独自のエコシステムがあります。同時に、C/C などのプログラミング言語はシステム リソースに直接アクセスできるため、コア ユニットの使用の最適化に役立ち、超高速で効率的なプログラムが得られます。しかし、ソフトウェア開発の世界ではどちらもそれぞれの用途があります。

すべてのプログラミング言語には、コンパイルおよび実行プロセスに多くの類似点があります。最も重要な点はメモリ管理です。どの言語を使用する場合でも、メモリ リソースを適切に管理することによってのみアプリケーションのパフォーマンスを適切に管理できるため、メモリ管理はプログラムの全体的な効率に重要な影響を与えます。

Java でのメモリの実行

基盤となるプラットフォームは、アプリケーションに必要なメモリを提供します。これはアプリケーション間でよく見られる状況であり、各アプリケーションが最適に動作することを可能にします。 Java では、オペレーティング システムは、JVM によって提供されるメモリ リソースを使用するための認証を必要とします。 Java では、JVM メモリはメソッド領域、ヒープ、スタック、PC レジスタ、ローカル メソッド スタックの 5 つの主要な部分に分割されます。

この記事では主にヒープとスタックに焦点を当てます。メモリは白紙の紙ではなく、プログラマーが自由にデータを書き込むことはできません。使用する前に構造化する必要があります。スタックとヒープはメモリを使用する際のデータ構造であり、プログラムの実行中、格納されたデータはプログラムの目的に応じてさまざまな目的に使用されます。

JVM は、プログラムの実行中に使用されるランタイム データ領域を決定します。一部のデータ領域は JVM に依存しています。つまり、データ領域は JVM の開始時に作成され、JVM ライフサイクル全体にわたって保持されます。ただし、各スレッドは他のデータ領域を作成および破棄します。 JVM は複数の実行スレッドを同時に実行できます。つまり、各スレッドには、実行されている現在の命令の位置を維持するための独自の PC (プログラム カウンター、プログラム カウンター) と、静的メモリ割り当てを保存するためのスタック フレームがあります。

スタック

スタックとは、開発者がスタックの最上位からのみデータを取得できるように要素を格納するメモリ内の構造です (多くの場合、先入れ先出しと呼ばれます)。アウト (FILO) または LIFO)。各スレッドには、静的メモリ割り当てに関連する変数を保存するプライベート JVM スタックがあります。実際、コード内で宣言および使用されるメソッドでは、特定のプリミティブ変数がスタック領域に格納されます。また、実際にヒープメモリに格納されているオブジェクトへの参照もスタック領域に格納されます。したがって、ローカルに割り当てられたメモリはすべてスタックに格納されます。

スタック メモリのデフォルト サイズは、JVM パラメータ -Xss を使用して変更できます。割り当てられた変数が多すぎる場合、またはメソッドがそれ自体を再帰的に呼び出す場合、スタックがオーバーフローすることがあります。すべての Java プログラマが知っている一般的なエラーは Java.lang.stackoverflowerror です。これは、スタック メモリが不十分な場合にプロンプ​​トが表示されます。 Java の各メソッド呼び出しはスタック上にメモリの一部を割り当てるため、不適切に設計された再帰的なメソッド呼び出しは簡単にすべてのスタック メモリを占有し、スタック メモリ オーバーフロー エラーを引き起こす可能性があります。

ヒープ

ヒープとは、JVMの起動時に作成されるメモリ領域で、JVMが破棄されるまで存在します。単一スレッドのプロパティであるスタックとは異なり (各スレッドには独自のスタックがあるため)、ヒープは実際には JVM 自体によって管理されるグローバル メモリであり、このメモリは実行時にオブジェクトにメモリを割り当てるために使用されます。したがって、オブジェクトのインスタンス化には、ユーザー定義クラス、JDK、またはその他のライブラリ クラスを使用できます。つまり、new キーワードを使用して作成されたオブジェクトはすべてヒープ メモリに格納されます。ヒープ メモリ内のオブジェクトには、JVM で実行されているすべてのスレッドからアクセスできます。アクセス管理は非常に複雑で、非常に複雑なアルゴリズムを使用するため、ここで JVM ガベージ コレクターが活躍します。

ヒープのデフォルトのサイズは、JVM パラメータ -Xms および -Xmx を使用して変更できます。オブジェクトが作成および破棄されると、ヒープのサイズも増加または減少します。最大メモリ制限に達し、さらにメモリを割り当てようとすると、java.lang.OutOfMemoryError がスローされます。

ヒープの

String Pool (StringPool)

Java.lang.String クラスは Java で最も使用されるクラスであるため、その効率には特別な注意を払う必要があります。基本的なデータ型と比較すると、文字列の演算効率は常に非常に遅いため、何らかの方法で文字列オブジェクトの演算効率と利便性を基本的なデータ型と同等またはそれに近づける必要があります。ヒープ 特別なメモリ領域 (StringPool) が JVM に割り当てられ、作成された文字列オブジェクトはすべて JVM によって StringPool に格納されます。これにより、ヒープ内に作成された他のオブジェクトと比較してパフォーマンスが向上します。

コード例から説明するヒープとスタック

Java でのヒープ メモリとスタック メモリの使用法をよりよく説明するために、簡単なプログラムを作成して、どのメモリにどの割り当てを割り当てるかを決定してみましょう。またはスタック:

public class HeapAndStackTest {
    public static void main(String[] args) {
        int x=10;
        int y=20;
        String greet = "Hello";
        Date d = new Date();
        diff(x, y);
    }

    public static int diff(int x1, int x2) {
        return x2-x1;
    }
}
ログイン後にコピー

このコードは次のように実行されます:

  • プログラムが開始され、JVM が Java ランタイム環境 (JRE) クラスをヒープ中央にロードします。

  • main() メソッドに遭遇すると、スタック フレームが作成されます。

  • ローカル変数 x および y はスタックに保存されます。

  • Stringgreet はヒープの StringPool 領域に割り当てられます。

  • Date オブジェクトはヒープ領域に割り当てられ、その参照 d はスタックに格納されます。

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

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

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