Java 仮想マシンのメモリ管理の詳細な分析
この記事では、Java 仮想マシンのメモリ管理について詳しく説明します。必要な方は参考にしてください。
ランタイムメモリには以下が含まれます:
-
メソッド領域
-
仮想マシンスタック(VMスタック)
-
ネイティブメソッドスタック
-
ヒープ
プログラムカウンター 登録
プログラムカウンター
は、現在のスレッドによって実行されるバイトコードの行番号インジケーターと見なすことができる比較的小さなメモリ空間です。 (バイトコード インタプリタは、このカウンタの値を変更して、実行する必要があるバイトコード命令を選択することによって機能します)。
Java 仮想マシンのマルチスレッドは、スレッドを順番に切り替えてプロセッサの実行時間を割り当てることによって実装されるため、いかなる瞬間においても、プロセッサは 1 つのスレッドでのみ命令を実行します。したがって、スレッド切り替え後に正しい実行位置に戻るためには、各スレッド間のカウンタが互いに影響を及ぼさずに独立して格納される、独立したプログラム カウンタが必要です。このようなメモリ領域を「スレッド プライベート」と呼びます。 「記憶の。
スレッドが Java メソッドを実行している場合、このカウンタは実行中の仮想マシンのバイトコード命令のアドレスを記録します。ネイティブ メソッドの場合、カウンタ値は空です。
Java 仮想マシン スタック
Java 仮想マシン スタックもスレッドプライベートであり、スレッドと同じライフサイクルを持ちます。
仮想マシン スタックは、実行のメモリ モデルを表します。各メソッドが実行されると、ローカル変数テーブル、オペランド スタック、ダイナミック リンク、メソッド出口、その他の情報を保存するためにスタック フレームが作成されます。各メソッドの呼び出しから実行完了までの処理は、仮想マシンにおけるスタックフレームのスタックへのプッシュおよびスタックからのポップアウトの処理に相当する。
スタックとは通常、仮想マシン スタック、または仮想マシン スタックのローカル変数テーブル部分を指します。
ローカル変数テーブルには、コンパイル時に既知のさまざまな基本データ型、オブジェクト参照、および returnAddress 型 (バイトコード命令のアドレスを指す) が格納されます。
long 型と double 型のデータは 2 つのローカル変数空間 (スロット) を占有しますが、他のデータ型は 1 つだけを占有します。
ローカル変数テーブルに必要なメモリ空間は、メソッドを開始するときに、このメソッドがフレーム内でどのくらいのローカル スカラー空間を割り当てる必要があるか完全に決定されます。ローカル変数テーブルは、コンパイル中に変更されません。メソッドの実行。
仮想マシンの仕様では、この領域について 2 つの例外が規定されています。スレッドによって要求されたスタックの深さが仮想マシンで許可されている深さよりも大きい場合、仮想マシンのスタックが動的に拡張できる場合は StackOverflowError 例外がスローされます。十分なメモリがない場合は、拡張を適用できません。OutOfMemoryError 例外がスローされます。
ローカル メソッド スタック
は、仮想マシン スタックと非常によく似ています。ローカル メソッド スタックは、仮想マシンによって使用されるネイティブ メソッドを提供します。ネイティブ メソッドの言語、使用法、データ構造に関する必須のルールはありません。
Java ヒープ
ほとんどのアプリケーションにとって、ヒープは仮想マシンによって管理される最大のメモリ部分です。
ヒープはすべてのスレッドによって共有されるメモリ領域であり、仮想マシンの起動時に作成されます。このメモリ領域の唯一の目的はオブジェクト インスタンスを保持することであり、ほぼすべてのオブジェクト インスタンス (すべてのオブジェクト インスタンスと配列) にメモリが割り当てられます。
Java ヒープは、ガベージ コレクターによって管理される主要な領域です。最新のコレクターは基本的にストライプ コレクション方式を使用するため、Java ヒープは新世代と旧世代に細分化することもできます。
メモリ割り当ての観点から、スレッド共有 Java ヒープは、複数のスレッドプライベート割り当てバッファ (スレッド ローカル割り当てバッファ、TLAB) に分割される場合があります。
Java ヒープは、論理的に連続している限り、物理的に不連続なメモリ空間を処理できます。実装する場合、固定サイズまたはスケーラブルとして実装できますが、主流の仮想マシンはスケーラブル (-Xms、-Xmx コントロール) として実装されます。
メソッド領域
Javaヒープと同様に、クラス情報、定数、静的変数、ジャストインタイムコンパイラでコンパイルされたコード、その他のデータを格納するために使用されます。仮想マシンによってロードされます。 Java 仮想マシンはメソッド領域をヒープの論理部分として記述しますが、Java ヒープと区別するために非ヒープと呼ばれる別名があります。
Java ヒープのような連続メモリを必要とせず、固定サイズまたは拡張性のオプションがあることに加えて、ガベージ コレクションを実装しないことも選択できます。この領域ではガベージ コレクションが発生することはほとんどありませんが、メソッド領域に入ると永遠の世代のように永続的に存在するわけではありません。この分野のメモリのリサイクルは、主に定数プールとアンロード タイプをリサイクルすることを目的としています。
ランタイム定数プール
はメソッド領域の一部です。クラス ファイルには、クラスのバージョン、フィールド、メソッド、インターフェイス、その他の情報に加えて、情報が含まれています。もう 1 つの情報は定数プール テーブルです。これは、コンパイル中に生成されるさまざまなリテラルおよびシンボル参照に使用されます。この内容は、クラスのロード後にメソッド領域の実行時定数プールに保存されます。
これは動的です。クラス ファイルに事前にインストールされている定数プールの内容のみがメソッド領域の実行時定数プールに入ることができます。この機能は、開発者によってよく使用されます。 String class intern().
オブジェクトの作成
仮想マシンが新しい命令を受け取ると、まずこの命令のパラメーターが定数プール内のクラスのシンボル参照を見つけることができるかどうかを確認し、シンボル参照をチェックします。表現されたクラスがロード、解析、および初期化されているかどうか。そうでない場合は、対応するクラスのロード プロセスを最初に実行する必要があります。
クラスロードチェック後に新しいオブジェクトにメモリを割り当てます。オブジェクトに必要なメモリの量は、クラスがロードされた後に完全に決定されます。
メモリ割り当ての完了後、仮想マシンに割り当てる必要のあるメモリ空間はゼロに初期化されます。TLAB を使用する場合、この作業は TLAB の割り当て時に事前に実行できます。
次に、仮想マシンは、オブジェクトがどのクラスのインスタンスであるか、クラスのメタデータ情報の検索方法、オブジェクトのハッシュ コード、オブジェクトの GC 生成期間など、オブジェクトに必要な設定を行います。およびその他の情報。この情報は、オブジェクトのオブジェクト ヘッダーに配置されます。
前のステップを完了すると、仮想マシンのタスクは完了しましたが、Java プログラムの観点から見ると、オブジェクトの作成が開始されたばかりで、
オブジェクトのメモリ レイアウト
メモリ内のオブジェクト メモリのレイアウトは、オブジェクト ヘッダー、インスタンス データ、アライメント パディングの 3 つの部分に分けることができます。
HotSpot 仮想マシンのオブジェクト ヘッダーは 2 つの部分で構成されます:
1. ハッシュ、GC 生成経過時間、ロック ステータス フラグ、ロックを保持しているスレッド、バイアスされたスレッド ID、バイアスされたタイムスタンプなどのオブジェクト自体のランタイム データを保存します。待って。 32 ビットおよび 64 ビットの仮想マシンのデータ長はそれぞれ 32 ビットおよび 64 ビットであり、正式には「マーク ワード」と呼ばれます。
2. オブジェクトのクラス メタデータのポインターである型ポインター。仮想マシンはこのポインターを使用して、オブジェクトがどのクラスのインスタンスであるかを判断します。オブジェクトが Java 配列の場合、仮想マシンは通常の Java オブジェクトのメタデータを通じて Java オブジェクトのサイズを決定できるため、オブジェクト ヘッダーに配列の長さを記録するために使用されるデータが必要です。配列のメタデータからはサイズを決定できません。
オブジェクトの配置へのアクセス (P48)
Java プログラム スタック上の参照データは、次の 2 つの主流の方法を通じてヒープ内のオブジェクト インスタンスにアクセスできます。
ハンドル: ハンドルとして使用されるメモリの一部が Java ヒープに割り当てられ、参照にはこのオブジェクトのハンドル アドレスが格納されます。ハンドルには、オブジェクト インスタンス データと型データの特定のプロパティが含まれます。
ダイレクト ポインター: Java ヒープ オブジェクト レイアウトでは、型データ関連情報へのアクセスを防ぐ方法を考慮する必要があります。
関連する推奨事項:
Java 仮想マシンによって管理されるメモリ ランタイム データ領域の詳細な紹介
JAVA 仮想マシン関連の知識 - JVM メモリ モデルの詳細なグラフィックとテキストの説明
以上がJava 仮想マシンのメモリ管理の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java 開発の必需品: Java 仮想マシンのインストール手順の詳細な説明、必要な特定のコード例 コンピューター科学技術の発展に伴い、Java 言語は最も広く使用されるプログラミング言語の 1 つになりました。クロスプラットフォームとオブジェクト指向という利点があり、開発者にとって徐々に好まれる言語になってきました。開発に Java を使用する前に、まず Java 仮想マシン (JavaVirtualMachine、JVM) をインストールする必要があります。この記事では、Java 仮想マシンのインストール手順を詳細に説明し、具体的なコード例を示します。

インターネットの継続的な発展に伴い、Java 言語で開発されたプログラムの使用を必要とするアプリケーションやビジネスがますます増えています。 Java プログラムを実行するには、Java 仮想マシン (JVM) のパフォーマンスが非常に重要です。したがって、構成の最適化は、Java アプリケーションのパフォーマンスを向上させる重要な手段です。 Pagoda パネルは、ユーザーがサーバーをより便利に管理できるようにする、一般的に使用されるサーバー コントロール パネルです。この記事では、Pagoda パネルを使用して Java 仮想マシンの構成を最適化する方法を紹介します。ステップ 1: Java 仮想マシンをインストールする

Java 仮想マシンは参照カウントを使用してメモリ使用量を管理し、オブジェクトの参照カウントが 0 に達すると、JVM はガベージ コレクションを実行します。参照カウントのメカニズムには次のものが含まれます。各オブジェクトには、そのオブジェクトを指す参照の数を保存するカウンターがあります。オブジェクトが作成されると、参照カウンタは 1 に設定されます。オブジェクトが参照されると、参照カウンタがインクリメントされます。参照が終了すると、参照カウンタがデクリメントされます。

スタック フレームは、Java 仮想マシン (JVM) でメソッドを実行するための基本的なデータ構造であり、次の部分が含まれます。 ローカル変数テーブル: メソッドのローカル変数を格納します。オペランド スタック: オペランドと中間結果を格納します。フレーム データ: 戻りアドレスと現在のプログラム カウンタが含まれます。スタック フレームの機能には次のものが含まれます。 ローカル変数の保存。オペランド演算を実行します。メソッド呼び出しを処理します。例外処理を支援します。ゴミ収集のお手伝い。

JVM 原理の詳細な説明: Java 仮想マシンの動作原理を詳しく調べるには、特定のコード例が必要です。 1. はじめに Java プログラミング言語の急速な発展と広範な応用により、Java 仮想マシン (JavaVirtualMachine、JVM と呼ばれます) が登場しました。 )もソフトウェア開発には欠かせないものとなっています。 Java プログラムの実行環境として、JVM はクロスプラットフォーム機能を提供し、Java プログラムをさまざまなオペレーティング システムで実行できるようにします。この記事では、JVM の仕組みについて詳しく説明します。

Java コア テクノロジ スタック: Java 言語、Java 仮想マシン、および JavaSE ライブラリについての深い理解 コンピュータ科学とテクノロジの継続的な発展により、Java 言語は世界で最も人気のあるプログラミング言語の 1 つになりました。 Java は、クロスプラットフォームの高水準プログラミング言語として、さまざまな分野、特にエンタープライズ レベルのアプリケーション開発やクラウド コンピューティングで広く使用されています。優れた Java 開発者になるには、Java コア テクノロジ スタック、つまり Java 言語、Java 仮想マシン、および Java に精通している必要があります。

ゼロから始める Java 仮想マシンのインストールと構成の詳細な説明 [はじめに] Java はクロスプラットフォームのプログラミング言語であり、その実行プラットフォームは Java 仮想マシン (JavaVirtualMachine、JVM) に依存します。 Java 仮想マシンをインストールして構成すると、さまざまなオペレーティング システムで Java プログラムを実行できます。この記事では、ゼロから説明し、Java 仮想マシンをインストールして構成する方法を詳しく説明し、一般的に使用される Java コードの例をいくつか示します。学習を始めましょう! 【前編:J】

Java 仮想マシン インストール ガイド: インストール方法を段階的に説明します。具体的なコード例が必要です。 はじめに: Java 仮想マシン (JavaVirtualMachine、JVM と呼ばれます) は、Java バイトコードを実行できる仮想マシンです。これは Java テクノロジーの中核コンポーネントであり、Java アプリケーションを複数のプラットフォームで実行できるようにする鍵となります。この記事では、Java 仮想マシンをインストールする方法を段階的に説明し、すぐに開始できるように具体的なコード例を示します。 1.JavaDevをダウンロードする
