JVMメモリ領域分割の深い理解

JVMメモリ領域分割の深い理解

[[436712]]

この記事はWeChatの公開アカウント「馬崇嘉」から転載したもので、著者は馬崇嘉です。この記事を転載する場合は、馬崇嘉公式アカウントまでご連絡ください。

1. Java ファイルはどのように実行されますか?

実行プロセス:

1. Javaファイルは.classバイトコードファイルにコンパイルされます。

2. バイトコードファイルはクラスローダーを通じてJVM仮想マシンにロードされます。

3. ロード後、JVM実行エンジンによって実行される

プログラム実行プロセス全体を通じて、JVM はプログラム実行中に必要なデータと関連情報を格納するためのスペースを使用します。この領域は一般にランタイム データ領域と呼ばれ、JVM メモリと呼ばれることもあります。

2. ランタイム データ領域を構成する要素は何ですか?

ランタイム データ領域には、主に次の 5 つのブロックが含まれます。メソッド領域とヒープはスレッド共有領域であり、スレッドの安全性の問題があります。 Java スタック、ローカル メソッド スタック、およびプログラム カウンターは排他的な領域であり、スレッド セーフティの問題はありません。 JVM のチューニングは主にヒープとスタックを中心に行われます。

1. 方法領域

各クラスの情報(クラス名、メソッド情報、フィールド情報を含む)、静的変数、定数、コンパイラによってコンパイルされたコードが格納されます。クラス ローダーが .class ファイルをランタイム データ領域にロードすると、最初にこの領域にスローされます。

クラス ファイルには、クラス フィールド、メソッド、インターフェイスなどの説明情報に加えて、コンパイル中に生成されたリテラルとシンボリック参照を格納するために使用される定数プールも含まれています。

メソッド領域で非常に重要な部分は、各クラスまたはインターフェースの定数プールのランタイム表現であるランタイム定数プールです。クラスとインターフェースが JVM にロードされた後、対応するランタイム定数プールが作成されます。もちろん、クラス ファイル定数プールの内容だけがランタイム定数プールに入るわけではありません。 String の intern メソッドなど、実行時に新しい定数を実行時定数プールに配置することもできます。

2.ヒープ

メソッド領域と同様にスレッド共有領域であり、主にオブジェクトインスタンスや配列などの保存されたデータが格納されます。

ヒープは Java ガベージ コレクターによって管理される主要な領域であり、JVM にはヒープが 1 つだけ存在します。

3. Javaスタック

Java スタックは、Java 仮想マシン スタックとも呼ばれます。 Java スタックは、Java メソッド実行のためのメモリ モデルです。

Java スタックはスタック フレームを 1 つずつ格納します。各スタック フレームは、呼び出されたメソッドに対応します。スタック フレームには、ローカル変数テーブル (ローカル変数)、オペランド スタック (オペランド スタック)、現在のメソッドが属するクラスのランタイム定数プールへの参照 (ランタイム定数プールの概念についてはメソッド エリアで説明します) (ランタイム定数プールへの参照)、メソッドの戻りアドレス (戻りアドレス)、およびその他の追加情報が含まれます。スレッドがメソッドを実行すると、対応するスタック フレームが作成され、作成されたスタック フレームがスタックにプッシュされます。メソッドが実行されると、スタック フレームがポップされます。したがって、スレッドによって現在実行されているメソッドに対応するスタック フレームは、Java スタックの最上部にある必要があることがわかります。この時点で、再帰メソッドを使用するとスタック メモリ オーバーフローが発生する可能性が高くなる理由と、スタック領域をプログラマーが管理する必要がない理由を誰もが理解しているはずです (もちろん、Java では、独自のガベージ コレクション メカニズムがあるため、プログラマーは基本的にメモリの割り当てと解放について心配する必要はありません)。このスペースの割り当てと解放はシステムによって自動的に実行されます。すべてのプログラミング言語において、スタック空間はプログラマーにとって不透明です。次の図は、Java スタック モデルを示しています。

ローカル変数テーブルは、その名前が示すように、説明がなくても誰もがその機能を理解できると思います。メソッド内のローカル変数 (メソッドおよび関数パラメータで宣言された非静的変数を含む) を格納するために使用されます。基本データ型の変数の場合はその値が直接格納され、参照型の変数の場合はオブジェクトへの参照が格納されます。ローカル変数テーブルのサイズはコンパイラによって決定できるため、プログラム実行中にローカル変数テーブルのサイズは変更されません。

オペランド スタック。データ構造のスタックについて学んだ人は、式の評価の問題に精通している必要があります。スタックの最も典型的な用途の 1 つは、式を評価することです。スレッドがメソッドを実行するプロセスについて考えてみましょう。これは実際にはステートメントを継続的に実行するプロセスであり、最終的には計算のプロセスです。したがって、プログラム内のすべての計算プロセスはオペランド スタックの助けを借りて完了すると言えます。

ランタイム定数プールへの参照。クラス内の定数はメソッドの実行中に使用される必要がある場合があるため、ランタイム定数への参照が必要です。

メソッドの戻りアドレス。メソッドが実行されると、メソッドは以前に呼び出された場所に戻るため、メソッドの戻りアドレスをスタック フレームに保存する必要があります。

各スレッドで実行されるメソッドは異なる可能性があるため、各スレッドには独自の Java スタックがあり、互いに干渉することはありません。

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

Thread クラスのソース コードを開くと、start() メソッドが native キーワードで変更されており、メソッド本体がないことがわかります。ネイティブで変更されたこのメソッドはローカル メソッドです。

  1. プライベートネイティブvoid start0();

ネイティブ メソッド スタックと Java スタックの機能と原理は非常に似ています。唯一の違いは、Java スタックは Java メソッドの実行に使用され、ネイティブ メソッド スタックはネイティブ メソッドの実行に使用されることです。 JVM 仕様では、ローカルで開発された特定の実装方法やデータ構造に対して必須の要件を課していません。仮想マシンはそれを自由に実装できます。 HotSopt 仮想マシンでは、ネイティブ メソッド スタックと Java スタックが直接 1 つに結合されます。

5. プログラムカウンタ

プログラム カウンター レジスタ (PC レジスタとも呼ばれます)。アセンブリ言語を学んだ学生なら、プログラム カウンターの概念に馴染みがあるはずです。アセンブリ言語では、プログラム カウンターは、プログラムによって現在実行されている命令のアドレスを格納する CPU 内のレジスタを指します (次の命令が配置されている記憶装置のアドレスを格納するとも言えます)。 CPU が命令を実行する必要があるときは、プログラム カウンタから現在実行しようとしている命令が配置されているストレージ ユニットのアドレスを取得し、取得したアドレスに基づいて命令を取得する必要があります。プログラムカウンタは命令を取得した後、自動的に 1 を加算したり、転送ポインタに基づいて次の命令のアドレスを取得したりします。すべての命令が実行されるまでサイクルは継続されます。

JVM のプログラム カウンターは、アセンブリ言語のプログラム カウンターのような物理的な CPU レジスタではありませんが、JVM のプログラム カウンターの機能は、アセンブリ言語のプログラム カウンターの機能と論理的に同等であり、どの命令を実行するかを示すために使用されます。

JVM では、複数のスレッドが順番に切り替えることで CPU 実行時間を取得します。したがって、特定の瞬間には、CPU コアは 1 つのスレッド内の命令のみを実行します。したがって、スレッド切り替え後に各スレッドが切り替え前のプログラム実行位置を再開できるようにするには、各スレッドが独自の独立したプログラム カウンターを持ち、互いに干渉できないようにする必要があります。そうしないと、プログラムの正常な実行順序に影響します。したがって、プログラム カウンターは各スレッドに固有のものであると言えます。

JVM 仕様では、スレッドが非ネイティブ メソッドを実行する場合、プログラム カウンターに現在実行する必要がある命令のアドレスが格納されると規定されています。スレッドがネイティブ メソッドを実行する場合、プログラム カウンターの値は未定義になります。

プログラムカウンタに格納されるデータが占める空間のサイズはプログラムの実行に伴って変化しないため、メモリ領域の中で唯一OutOfMemoryErrorが発生しない領域であり、占有するメモリ空間も非常に小さいため基本的に無視できる程度です。

<<:  Kubernetes レプリケーション コントローラーの仕組み

>>:  生まれたばかりの子牛はトラを怖がらない!今年注目すべきクラウドコンピューティングのスタートアップ10社

推薦する

DingTalk が「Circles」をリリース、ソーシャル精神は健在か?

過去2日間、 DingTalkとWeChat for Enterpriseは密かに競争しており、それ...

360度検索トラフィックの急増には理由があり、将来的にそれを維持できるかどうかが鍵となる

2012年8月16日、360は検索エンジンに参入し始め、数え切れないほどのウェブマスターの注目を集め...

SEO 効率を高めるために大量のウェブサイトのパスワード情報を記憶する方法

SEO 効率を向上させるために、Web サイトのパスワード情報を大量に記憶する方法。大量のウェブサイ...

「2013年中国インターネットユーザーのオンラインビデオアプリケーション研究報告」の2つのポイントの解釈

中国インターネットネットワークインフォメーションセンター(CNNIC)は2014年6月9日、「201...

クラウド コンピューティングはデータ サイエンスのワークフローをどのように促進しますか?

データ サイエンスは、さまざまな方法、ツール、テクニックを使用してデータから洞察と価値を抽出するプロ...

分散データベースにおける複雑な障害をエレガントに解決する方法

障害の説明ACID はトランザクションの 4 つの特性であり、そのうち D (Duration) は...

ビッグデータ時代のデジタル・モバイル・インターネット運用におけるビジネス秘訣!

天猫が発表した数字によると、2015年のダブル11ショッピングフェスティバル後、モバイル取引が68%...

口コミマーケティングがブランドにトラフィックをもたらす:「江小三」シリーズ - 三匹のリス

月収10万元の起業の夢を実現するミニプログラム起業支援プラン現在、Three Squirrelsはナ...

起業家キャンプが戻ってきました!フェーズ II: インド両国市場に重点を置きます。現在、予約を受け付けています。

10月26日、ホワイトホエール海外起業キャンプ第2フェーズ「インド・インドネシア向け海外起業キャンプ...

この段階で SEO はウェブサイトをどのようにランク付けするのでしょうか?

最近の SEO 担当者にとって最大の悩みの種は外部リンクの構築だと思います。Baidu で外部リンク...

2019 年のデータセンターの 5 つのトレンド: エッジ コンピューティングが変化を推進

2019 年を迎えても、ネットワーク エッジはデータ センター分野におけるイノベーションのテクノロジ...

インターネット マーケティング: 「大きくて完全」 vs. 「小さくて美しい」

オンラインマーケティングといえば、多くの人がすぐに SEO、SEM、EDM などの言葉を思い浮かべま...

618年の最初の戦いで、JD.com + PinduoduoがTaobaoより小さいのはなぜですか?

現在、あらゆる面からのデータから判断すると、618カーニバルの人気はタオバオに集中している。では、こ...

分析する価値のある競合ウェブサイトとその分析方法について簡単に説明します。

みなさんこんにちは。私はハルビン仮想および現実ウェブサイトデザインです。最近、オンラインでいくつかの...