ヒープとスタック: Java が何を覚えるべきか、何を忘れるべきかを管理する方法

PHPz
リリース: 2024-09-08 16:32:02
オリジナル
428 人が閲覧しました

プログラムを実行すると、アプリケーションが必要な限りデータを保存したり取得したりできるように、オペレーティング システムがメモリを割り当てます。プログラマが自由にメモリを割り当て、ポインタを「手動」で管理できる C や C++ とは異なり、Java では JVM (Java 仮想マシン) が揮発性ストレージを管理し、ヒープとヒープという 2 つの割り当てシステムでこの複雑さを抽象化します。積み重ねます。

それらの違いは、ストレージの目的と、そのデータを複数のプロセスで共有する必要があるかどうかにあります。

JVM は 短期データ用のスタック を使用し、LIFO (Last In First Out) 構造に従います。スタックは、メソッドの実行を管理し、ローカル変数とメソッド呼び出しをフレーム内に整理して保存するために使用されるメモリ領域です。 JVM の各スレッドには独自のスタックがあります。

ヒープは、すべてのスレッド間で共有されるグローバル メモリ領域です。ここには、オブジェクトと変数を作成したメソッドの範囲を超えて耐用年数を持つ必要があるオブジェクトと変数が割り当てられます。

ヒープ上のメモリはガベージ コレクターによって管理され、未参照のオブジェクトを削除して領域を解放し、長期データに使用されます。

実際的な例を使ってみましょう。

メソッドのスコープ内でプリミティブ変数が作成される場合、メソッドの実行中にその変数を使用できる必要があります。このように、プログラム内で固有かつ特定の用途を持つデータのライフサイクルを担当するのはスタックであるため、この変数を保存するのはスタックです。

ただし、メソッドがインスタンスを作成すると、このオブジェクトは宣言された場所だけでなく、プログラムの他の部分でも使用できます。これは明らかに、データベース内のレコードを表すオブジェクトを作成するときに発生します。私たちのプログラムでは、実行中にこの同じインスタンスを参照、編集、削除できます。このようにして、ヒープがオブジェクトの保存を処理します。

この点を説明するために、著者 Hanumant Deshmukh がガイド『OCP Java SE 17/21 Programmer Exam Fundamentals』で説明している簡単な例を使用します。ちなみに、この本は非常に複雑なプロセスを非常に教訓的に説明しているので、素晴らしいです。私と同じように、Oracle Certified Professional (OCP) 認定資格を探している場合は、これを強くお勧めします。著者は教育目的で String のインスタンスを使用していますが、ここでは著作権侵害のリスクを避けるためだけにカスタム オブジェクトを使用します (:S)

public class Main {
    public static void main(String[] args) {
        HeapObj heapObject = newObject();
        int counter = 0;

        while (counter++ < 10){
            print(heapObject.getName());
        }
    }

    public static HeapObj newObject(){
        return new HeapObj("Happy instance");
    }

    public static void print(String text){
        System.out.println(text);
    }
}

ログイン後にコピー

この例では、Main クラスは 3 つのメソッドを呼び出します。メイン メソッド、HeapObj オブジェクトのインスタンスを作成するメソッド、およびテキストを出力するだけのメソッドです。

すべてのメソッドが呼び出されたときに写真を撮ると、スタックとヒープは次のようになります。

Heap vs Stack: como o Java gerencia o que deve ser lembrado ou esquecido

言い換えると:

1. 起動時:

スタック: メインフレーム (引数、ヒープオブジェクト、カウンターを含む)。
ヒープ: 空です。

2. newObject の後:

スタック: メインフレーム (引数、ヒープオブジェクト参照、カウンターを含む)。
ヒープ: 文字列「Happy instance」を持つ HeapObj オブジェクト。

3. ループ中:

スタック: メイン フレーム (引数、ヒープオブジェクト参照、カウンターを含む)、スタックおよびアンスタックされた複数の印刷フレーム。
ヒープ: 同じ HeapObj オブジェクトと文字列「Happy instance」。

4. ループの後:

スタック: メインフレーム (引数、ヒープオブジェクト参照を含む)。
ヒープ: 同じ HeapObj オブジェクトと文字列「Happy instance」。

5. プログラムの最後に:

スタック: 空です。
ヒープ: 空。

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

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート