Java仮想マシンの構造: ランタイムデータ領域

Java仮想マシンの構造: ランタイムデータ領域

Java 仮想マシンは複数のスレッドの同時実行をサポートでき、各 Java 仮想マシン スレッドには独自の pc レジスタがあります。いつでも、Java 仮想マシン スレッドは 1 つのメソッドのコードのみを実行します。スレッドによって実行されているメソッドは、スレッドの現在のメソッドと呼ばれます。

このメソッドがネイティブでない場合、pc レジスタには、Java 仮想マシンによって実行されているバイトコード命令のアドレスが格納されます。メソッドがネイティブの場合、pc レジスタの値は未定義になります。 pc レジスタの容量は、少なくとも returnAddress 型のデータまたはプラットフォームに依存するローカル ポインター値を格納できる必要があります。

Java 仮想マシン スタック

各 Java 仮想マシン スレッドには独自のプライベート Java 仮想マシン スタックがあり、これはスレッドと同時に作成され、スタック フレームを格納するために使用されます。 Java 仮想マシン スタックは、ローカル変数と計算されていない結果の一部を保存するために使用されます。さらに、メソッドの呼び出しと戻りにおいても重要な役割を果たします。 Java 仮想マシン スタックは、スタック フレームのポップとプッシュ以外の要因の影響を受けないため、スタック フレームをヒープ内に割り当てることができ、Java 仮想マシン スタックが使用するメモリが連続していることを保証する必要がありません。

Java 仮想マシンの実装では、プログラマーまたはエンド ユーザーに仮想マシン スタックの初期容量を調整する手段を提供する必要があります。動的に拡張および縮小できる Java 仮想マシン スタックの場合、最大容量と最小容量を調整する手段を提供する必要があります。

Java 仮想マシン スタックでは次の例外が発生する可能性があります。

  • スレッドによって要求されたスタック容量が Java 仮想マシン スタックで許可される最大容量を超える場合、Java 仮想マシンは StackOverflowError 例外をスローします。
  • Java 仮想マシン スタックが動的に拡張可能で、拡張しようとしたときにメモリが不足することが予想される場合、または新しいスレッドを作成するときに、対応する仮想マシン スタックを作成するために使用できるメモリが不足している場合、Java 仮想マシンは OutOfMemoryError 例外をスローします。

Javaヒープ

Java 仮想マシンでは、ヒープはすべてのスレッドで共有できる実行時メモリ領域であり、すべてのクラスインスタンスと配列オブジェクトにメモリが割り当てられる領域でもあります。

Java ヒープは仮想マシンの起動時に作成されます。自動管理システム (ガベージ コレクターとも呼ばれます) によって管理されるさまざまなオブジェクトを格納します。これらの管理対象オブジェクトは明示的に破棄する必要はなく、破棄することもできません。仮想マシンの実装者は、システムの実際のニーズに基づいて自動メモリ管理テクノロジを選択できます。 Java ヒープの容量は固定することも、プログラムの実行時に動的に拡張することもでき、また、必要なスペースが多すぎる場合は自動的に縮小することもできます。 Java ヒープによって使用されるメモリが連続していることを保証する必要はありません。

Java 仮想マシンの実装では、プログラマーまたはエンド ユーザーに Java ヒープの初期容量を調整する手段を提供する必要があります。動的に拡張および縮小できる Java ヒープの場合、最大容量と最小容量を調整する必要があります。

Java ヒープでは次の例外が発生する可能性があります。

  • 実際に必要なヒープが自動メモリ管理システムが提供できる最大容量を超える場合、Java 仮想マシンは OutOfMemoryError 例外をスローします。

方法領域

Java 仮想マシンでは、メソッド領域はすべてのスレッドで共有できるランタイム メモリ領域です。メソッド領域は、従来の言語のコンパイルされたコード保存領域や、オペレーティング システム プロセスのテキスト セグメントと非常によく似ています。実行時定数プール、フィールドとメソッドのデータ、コンストラクタと通常のメソッドのバイトコードの内容など、各クラスの構造情報を格納します。また、クラス、インスタンス、およびインターフェースの初期化で使用されるいくつかの特殊なメソッドも含まれます。

メソッド領域は、仮想マシンの起動時に作成されます。メソッド領域はヒープ内の論理コンポーネントですが、単純な仮想マシン実装では、この領域にガベージ コレクションと圧縮を実装しないことも選択できます。メソッド領域の容量は固定することも、プログラムの実行時に動的に拡張することもでき、また、必要なスペースが多すぎる場合は自動的に縮小することもできます。メソッド領域は実際のメモリ空間では連続していない可能性があります。

Java 仮想マシンの実装では、プログラマーまたはエンド ユーザーにメソッド領域の初期容量を調整する手段を提供する必要があります。動的に拡張および縮小できるメソッド領域の場合、実装では最大容量と最小容量を調整する手段を提供する必要があります。

メソッド領域では次の例外が発生する可能性があります。

  • メソッド領域のメモリ空間がメモリ割り当て要求を満たすことができない場合、Java 仮想マシンは OutOfMemoryError 例外をスローします。

ランタイム定数プール

ランタイム定数プールは、クラス ファイル内の各クラスまたはインターフェイスの定数プール テーブルのランタイム表現です。これには、コンパイル時に認識される数値リテラルから、実行時に解決する必要があるメソッドまたはフィールド参照まで、さまざまな種類の定数が含まれます。ランタイム定数プールは従来の言語のシンボル テーブルに似ていますが、格納されるデータの範囲は通常の意味でのシンボル テーブルよりも広くなります。

各ランタイム定数プールは、Java 仮想マシンのメソッド領域に割り当てられます。クラスとインターフェースを仮想マシンにロードすると、対応するランタイム定数プールが作成されます。

クラスとインターフェースのランタイム定数プールを作成するときに、次の例外が発生する可能性があります。

  • クラスまたはインターフェースを作成するときに、ランタイム常時オン プールを構築するために必要なメモリ領域がメソッド領域が提供できる最大値を超えると、Java 仮想マシンは OutOfMemoryError 例外をスローします。

ネイティブメソッドスタック

Java 仮想マシンの実装では、ネイティブ メソッドの実行をサポートするために従来のスタックが使用される場合があります。このスタックはローカル メソッド スタックです。 Java 仮想マシンが別の言語を使用して命令セットインタープリターを実装する場合は、ネイティブメソッドスタックも使用できます。 Java 仮想マシンがネイティブ メソッドをサポートしていない場合、または従来のスタックに依存していない場合は、ネイティブ メソッド スタックが提供されない可能性があります。ネイティブ メソッド スタックがサポートされている場合、このスタックは通常、スレッドの作成時にスレッドごとに割り当てられます。

Java 仮想マシン仕様では、ネイティブ メソッド スタックを固定サイズとして実装したり、計算に基づいて動的に拡大および縮小したりすることができます。固定サイズのネイティブ メソッド スタックを使用する場合、スタックの作成時に各スレッドのネイティブ メソッド スタック容量を個別に選択できます。

Java 仮想マシンの実装では、プログラマーまたはエンド ユーザーにネイティブ メソッド スタックの初期容量を調整する手段を提供する必要があります。動的に拡張および縮小できるメソッド領域の場合、実装では最大容量と最小容量を調整する手段を提供する必要があります。

ローカル メソッド スタックでは次の例外が発生する可能性があります。

  • スレッドによって要求されたスタック容量がネイティブ メソッド スタックで許可される最大容量を超える場合、Java 仮想マシンは StackOverflowError 例外をスローします。
  • ネイティブ メソッド スタックが動的に拡張可能で、拡張しようとしたときにメモリが不足することが予想される場合、または新しいスレッドの作成時に対応するネイティブ メソッド スタックを作成するために十分なメモリがない場合は、Java 仮想マシンは OutOfMemoryError 例外をスローします。

<<:  アリババクラウド社長胡暁明:何百万人もの開発者とともにクラウドコンピューティングの未来を定義する

>>:  通信ベンダーがクラウド コンピューティングの発展を迅速に追跡する必要があるのはなぜですか?

推薦する

キーワードランキングが不安定な場合の対処法

みなさんこんにちは。私はHongtu Internetです。 2 か月前、下水道ウェブサイトの最適化...

3年間ウェブサイトを構築してきましたが、何も達成できず、A5の壁に直面しています。

時が経つのは早いものです。A5 に関する記事を最後に書いたのは 1 年前だったと記憶しています。それ...

企業にとってのオンラインニュースの意義と解決策

インターネットが世界中で急速に発展している現代では、雨後の筍のようにオンラインメディアが次々と登場し...

分散コンピューティングエンジン Flink/Spark の k8s 上での実装比較と実践

Flink や Spark に代表される分散ストリーム バッチ コンピューティング フレームワークの...

CQASO データ駆動型成長カンファレンス、すべての著名人がご参加をお待ちしています!

2017年3月25日、創奇信息技術(上海)有限公司は、世界有数のデータ収集・分析製品であるGrowi...

ウェブサイトのランキングをホームページに最適化する方法 - 手順の詳細かつ体系的な説明

ウェブサイトのランキングをホームページに最適化する方法 - 手順の詳細かつ体系的な説明当社の SEO...

ウェブサイトの包含重みの評価に関する検索エンジンの秘密

コアヒント: このような状況では、検索エンジンは通常、A に低い重みを与え、B に高い重みを与えます...

sharktech: 米国の高防御サーバー、無制限のトラフィック、1G 帯域幅で月額 49 ドル、10G 帯域幅で月額 279 ドル

SharkTech は現在、ロサンゼルスとデンバーのデータセンターのサーバーを大幅割引で提供していま...

Google ハングアウトは、国際通話の最初の 60 秒間をユーザーに無料で提供します

Google は、ビデオ グループ チャット ソフトウェア Hangouts の導入をユーザーに促す...

完全にGoogleのようなSEOはBaiduでは機能しない

最近、Dianshi Interactiveで多くの人がBaiduのアップデートの話題を議論している...

Baiduスナップショットハイジャックの原因と解決策

月収10万元の起業の夢を実現するミニプログラム起業支援プランご存知のとおり、SEO 業界で最も一般的...

自動車ウェブサイトのゲーム: Bitauto のプラットフォーム実験 遺伝子とチップ

長年にわたる個別競争と均質的な発展を経て、自動車インターネットメディアはプラットフォームベースのビジ...

クラウドコンピューティング導入の4つの段階

過去 60 年間のテクノロジーの採用をざっと見てみると、1 つのサプライヤー、テクノロジー、またはコ...

金曜日の百度の小規模アップデート後にウェブサイトのランキングが下がらないようにする方法

過去2回の金曜日の百度アップデートから判断すると、百度はこれまで通り金曜日に小規模なアップデートを実...

10以上のオンライン収益プロジェクトを経験した経験の概要

私は長い間ネットで稼ぐことに関わっていませんでした。始めたのは去年の11月です。きっかけは当時本当に...