この記事は、JVM メモリ モデルについて予備的な理解を提供します。これには一定の参考値があります。必要な友人は参照できます。すべての人に役立つことを願っています。
コンピュータ メモリ モデル
プログラムの実行中、CPU はメイン メモリにアクセスしてデータを取得しますが、 CPU の発展により、CPU のアクセス速度がますます高速になり、ハードウェアが CPU の条件を満たせなくなったため、ほとんどのメモリにはキャッシュ メカニズムが追加され、さまざまな CPU が対応する多レベル (通常 3 つの) キャッシュを備えています。データをフェッチすると、最初に 1 次キャッシュに続きます。2 次キャッシュ、3 次キャッシュ、メイン メモリの順にアクセスされるため、アクセス速度が向上しますが、同時に、異なるキャッシュ内のデータが取得されます。 CPU が異なるため、CPU とメイン メモリがデータ同期を達成できない可能性があります
JAVA メモリ モデル
JAVA メモリ モデル (Java メモリ モデル、JMM)コンピュータのメモリ モデル仕様に準拠しています。メモリ バリアを設定することで、異なるハードウェアやオペレーティング システムのアクセスの違いを防ぎます。これは、Java プログラムが異なるプラットフォーム上でメモリに一貫してアクセスできることを保証するメカニズムと仕様です。
5 つの主要なメモリ領域
1. プログラム カウンタ
各スレッドにはプログラム カウンタがあり、プログラム カウンタは現在のスレッドのプログラム バイトコードの行番号を識別するために使用されます。Java メソッドの実行中、プログラム カウンタはバイトコード ファイルの行番号を保存します。ネイティブ メソッドの実行中、プログラム カウンタの内容は空です。異なるスレッドには独自の排他的なプログラム カウンターがあります。スレッドにプライベートです。
2. JAVA 仮想マシン スタック
各メソッドは、実行時にスタック フレームを作成します (保存も含む)。ローカル変数テーブルとオペレーティングスタック、ダイナミックリンク、メソッドエクスポート、その他の情報。呼び出される各メソッドのプロセスは、仮想マシン スタック内のスタック フレームがスタックにプッシュされてからスタックからポップアウトされるまでのプロセスに対応します。
JAVA 仮想マシン スタックは主に、メソッド パラメータ、メソッド内のローカル変数、コンパイル中にロードされるデータ型、およびスレッドにプライベートな戻りアドレスの型を保存するために使用されます
3. ローカル メソッド スタック
には、JAVA 仮想マシン スタックと同様の機能があります。違いは、後者は仮想マシンによって実行される Java メソッド (バイトコード) を提供するのに対し、ローカル メソッド スタックは Java 仮想マシン スタックを提供することです。仮想マシンによって呼び出されるネイティブ呼び出しを処理します。メソッド、つまり基盤となるサービスは通常、C または C
4 で記述されます。ヒープ
ヒープは最大です。仮想マシンによってロードされるメモリ領域の一部であり、オブジェクト インスタンスの格納に使用されます。論理アドレスが連続している限り、不連続なメモリ アドレスに格納できます。新世代と旧世代に分かれており、新世代と旧世代の比率は1:2(パラメータ-XX:NewRatioで指定可能)です。エリア
# 永続世代とも呼ばれ、仮想マシンによってロードされるクラス情報、定数、および静的変数を保存するために使用され、スレッドの共有領域です。 JDK8 以降は廃止され、メタスペースに置き換えられました。 推奨チュートリアル:
Java チュートリアル以上がJVM メモリ モデルとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。