JVMの動作原理とスタックとヒープの実装プロセスの詳細な説明

JVMの動作原理とスタックとヒープの実装プロセスの詳細な説明

  [[267906]]

概要

オンライン システムでは CPU 100% 問題が発生するため、トラフィックが大きい場合にこの問題がより一般的に発生します。 JDK 自体には、jps、jstack、jmap、jhat、jstat などの多くの JVM デバッグ ツールがあるため、実際の作業ではデバッグにこれらのツールを使用することが非常に重要です。通常、CPU 100% の問題は上記のツールを通じて特定し、解決できます。

実際、Java 言語で記述されたソース プログラムは、Java コンパイラによってプラットフォームに依存しない「バイトコード プログラム」(.class ファイル、つまり 0,1 バイナリ プログラム) にコンパイルされ、その後、OS 上の Java インタープリタで解釈されて実行されます。 JVM は Java のコアおよび基盤であり、Java コンパイラと OS プラットフォーム間の仮想プロセッサです。そのため、JVM の動作原理を理解する必要があります。

JVM の原則

1. JVMの紹介

JVM は Java のコアおよび基盤であり、Java コンパイラと OS プラットフォーム間の仮想プロセッサです。これは、ソフトウェア メソッドを使用して実装された基盤となるオペレーティング システムとハードウェア プラットフォームに基づく抽象コンピュータであり、Java バイトコード プログラムを実行できます。

Java コンパイラは、JVM をターゲットにして、JVM が理解できるコードまたはバイトコード ファイルを生成するだけで済みます。 Java ソース ファイルはバイトコード プログラムにコンパイルされ、JVM は各命令をさまざまなプラットフォームのマシン コードに変換し、特定のプラットフォームで実行します。

2. Java言語の実行プロセス

Java言語で記述されたソースプログラムは、Javaコンパイラによってプラットフォームに依存しない「バイトコードプログラム」(.classファイル、つまり0,1バイナリプログラム)にコンパイルされ、OS上のJavaインタープリタで解釈されて実行されます。

3. JVMがプログラムを実行するプロセス

  • I. クラスファイルをロードします。
  • II.メモリを管理および割り当てます。
  • III.ガベージコレクションを実行します。

JRE(Java Runtime Environment)は、JVMによって構築されたJavaプログラムの動作環境です。

JVM のスタックとヒープ

JVM では、メモリはスタックとヒープという 2 つの部分に分かれています。ここでは、JVM のメモリ管理原則の観点からスタックとヒープについて理解し、これらの原則を使用して Java の静的メソッドと静的プロパティの問題を理解します。

1. はじめに

スタックはJVMのメモリ命令領域です。スタックの管理は非常に簡単です。特定のバイト長のデータまたは命令をプッシュすると、スタック ポインターは対応するバイトをスタックにプッシュします。特定のバイト長のデータまたは命令をポップすると、スタック ポインターがスタックをポップします。スタックは非常に高速で、管理が容易であり、各操作のデータまたは命令バイトの長さがわかっています。したがって、Java 基本データ型、Java 命令コード、および定数はすべてスタックに格納されます。

ヒープはJVMのメモリデータ領域です。ヒープ管理は非常に複雑で、特にオブジェクト インスタンスを格納するために、毎回不定の長さのメモリ領域が割り当てられます。オブジェクト インスタンスを保存するためにヒープ内に一定量のメモリを割り当てると、実際にはオブジェクト インスタンスの属性値、属性タイプ、オブジェクト自体のタイプ タグなどが保存されるだけで、オブジェクト メソッドは保存されません (メソッドは命令であり、スタックに保存されます)。オブジェクト インスタンスを保存するためにヒープ内に一定量のメモリを割り当てることは、オブジェクトのシリアル化に似ています。オブジェクト インスタンスがヒープ内に割り当てられた後、ヒープ内のオブジェクト インスタンスの位置を特定してオブジェクト インスタンスを見つけやすくするために、4 バイトのヒープ メモリ アドレスをスタックに保存する必要があります。

次の図は JVM のアーキテクチャを示しています。

2. データとは何ですか? 命令とは何ですか? オブジェクト メソッドとオブジェクト プロパティとは何ですか?

1) メソッド自体は命令のオペコード部分であり、スタックに格納されます。

2) メソッドの内部変数は、命令のオペコードに続く命令のオペランド部分であり、スタックに格納されます (実際には、単純な型はスタックに格納され、オブジェクト型はスタックにアドレスを格納し、値はヒープに格納されます)。上記の命令オペコードと命令オペランドは完全な Java 命令を構成します。

3) オブジェクトインスタンスは、その属性値を含めてデータ領域ヒープにデータとして保存されます。

非静的オブジェクト プロパティは、オブジェクト インスタンスの一部としてヒープ内に格納され、オブジェクト インスタンスにはスタック内に格納されたアドレス ポインターを介してアクセスする必要があります。したがって、オブジェクト インスタンスとその非静的プロパティ値にアクセスできるかどうかは、スタック内のオブジェクト インスタンスのアドレス ポインターを取得できるかどうかに完全に依存します。

JVM では、静的属性はスタック命令メモリ領域に格納され、動的属性はヒープ データ メモリ領域に格納されます。

要約:

1) スタックは実行時間の単位であり、ヒープはストレージの単位です。

2) スタックは、プログラムの動作、つまりプログラムの実行方法やデータの処理方法の問題を解決します。ヒープは、データ保存の問題、つまりデータをどのようにどこに保存するかという問題を解決します。

4. ヒープとスタックを区別する必要があるのはなぜですか?

***、ソフトウェア設計の観点から見ると、スタックは処理ロジックを表し、ヒープはデータを表します。この分離により、処理ロジックがより明確になります。分割して統治するという考え方。この分離とモジュール性の考え方は、ソフトウェア設計のあらゆる側面に反映されています。

2 番目に、ヒープとスタックを分離することで、ヒープの内容を複数のスタックで共有できるようになります (これは、複数のスレッドが同じオブジェクトにアクセスするとも考えられます)。こうした共有には数多くの利点があります。一方、この共有により、効率的なデータ相互作用の方法 (共有メモリなど) が提供されます。一方、ヒープ内の共有定数とキャッシュはすべてのスタックからアクセスできるため、スペースを節約できます。

3 番目に、システム操作のコンテキストを保存するなど、実行時のニーズにより、スタックをアドレス セグメントに分割する必要があります。スタックは上方向にしか成長できないため、スタックのコンテンツ保存能力が制限されます。ヒープが異なります。ヒープ内のオブジェクトは必要に応じて動的に増加します。したがって、スタックとヒープが分離されることにより、動的な拡張が可能になります。対応するスタックはヒープ内のアドレスを記録するだけで済みます。

4 番目に、オブジェクト指向はヒープとスタックの完璧な組み合わせです。実際、オブジェクト指向プログラムと以前の構造化プログラムの実行には違いはありません。しかし、オブジェクト指向プログラミングの導入により、問題に対する考え方が変わり、自然な思考に近づきました。オブジェクトを逆アセンブルすると、オブジェクトの属性は実際にはヒープ内に格納されているデータであることがわかります。オブジェクトの動作 (メソッド) は実行中のロジックであり、スタックに配置されます。オブジェクトを記述する場合、実際にはデータ構造とデータを処理するロジックの両方を記述します。

プログラムを実行するには常に開始点があります。 C 言語と同様に、Java では Main が開始点となります。どのような Java プログラムを実行している場合でも、メイン エントリ ポイントが見つかると、プログラムを実行するエントリ ポイントが見つかります。

5. ヒープには何が保存されますか?スタックには何が保存されますか?

1) オブジェクトはヒープに格納されます。スタックは、ヒープ内のプリミティブ データ型とオブジェクトへの参照を格納します。オブジェクトのサイズは推定不可能であり、動的に変更される可能性がありますが、スタックでは、オブジェクトは 4 バイトの参照にのみ対応します。

2) 基本型をヒープ内に配置しないのはなぜですか?占有するスペースは通常 1 ~ 8 バイトであるため、必要なスペースは比較的小さく、基本型であるため動的な増加はなく、長さは固定されているため、スタックに格納するだけで十分です。ヒープに格納しても意味がありません (スペースも無駄になりますが、これについては後で説明します)。基本的な型やオブジェクトへの参照はスタックに格納されており、すべて数バイトの数値であるため、プログラム実行時には統一的に扱われると言えます。ただし、基本型、オブジェクト参照、およびオブジェクト自体には違いがあります。一方はスタック内のデータであり、もう一方はヒープ内のデータであるためです。最も一般的な問題の 1 つは、Java でのパラメータ渡しの問題です。

3) Java でパラメータを渡す場合、値渡しになりますか?それとも参照ですか?プログラムの実行は常にスタック上で行われるため、パラメータを渡す場合は、基本型とオブジェクト参照を渡すだけの問題になります。オブジェクト自体は直接渡されません。

Java がメソッドを呼び出してパラメータを渡す場合、ポインタがないため、常に値で呼び出します。

PS: ヒープとスタックのうち、スタックはプログラム実行にとって最も基本的なものです。プログラムはヒープなしでも実行できますが、スタックなしでは実行できません。ヒープはスタックにデータ ストレージ サービスを提供します。簡単に言えば、ヒープは共有メモリです。しかし、ヒープとスタックを分離するという考え方があるからこそ、Java のガベージ コレクションが可能になります。

JVM の原則を深く理解することは、日常的なデバッグの問題に非常に役立ちます。運用と保守は、単に Linux コマンドを学ぶだけではありません。もっと深く知りたい場合は、開発について少し知っておく必要がある場合がよくあります。

<<:  クラウド間の移行に必要な 7 つの重要なステップ

>>:  AWSはアマゾンから分離される可能性、CEOは合意に従うと語る

推薦する

dominionhosting-512M(xen)/2IP/無料DAパネル/月額4.95ドル

dominionhosting は 10 年以上の歴史を持つホスティング会社です。前身は newwe...

onetechcloud: 労働者の日特別オファー、VPS が 27% オフ、香港 cn2 gia、米国 3 ネットワーク cn2 gia、米国 3 ネットワーク cn2 gia + 高防御

onetechcloud は、メーデー ゴールデン ウィークの特別オファーを提供します。香港 cn2...

WeChat公開アカウントのプロモーション、公開アカウントのトピックの選択方法!

この記事では、GQ Lab公式アカウントを例に、公式アカウントのトピックを選択するスキルと方法につい...

毎日の話題: アリ・マイクロファイナンスの資本構成と2万人の従業員が株式を共有

11月4日のウェブマスターネットワーク(www.admin5.com)によると、アリババは最近、アリ...

ウェブサイト構築:ユーザーの支出のほとんどはマーケティングに費やされている

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています企業のウェ...

小紅書のジレンマを解決できるのは誰か?

草植えトラックではアクションが頻繁に発生します。 3月10日のLatePostによると、lemon8...

デジタル変革は必須です。企業はどのようにこれを活用できるでしょうか?

[[398721]] COVID-19の流行の影響を経験した後、ほぼすべての企業がデジタル変革の重要...

123systems スーパーディスカウント: 85% オフ

123systems が逃げるかどうかは議論する必要はない。逃げるつもりなら、3 年前に逃げるべきだ...

トップレベルドメインが拡大するにつれて、通常のドメインはますます安価になる

IT Times記者 ユー・シンフェイかつて100万元だったヤオミンのドメイン名「yaoming.n...

クラウンクラウド - $7/Kvm/2g メモリ/30g ハードディスク/3T トラフィック/ロサンゼルス/QR データセンター

CrownCloud は設立から 2 年で、常に控えめな姿勢を貫いています。同社の製品は非常に堅実で...

口コミビーツールを使用して企業のSEO最適化の結果を改善する

1. SEO最適化では口コミの最適化に注意を払う必要がありますSEOといえば、キーワードランキングを...

クラウド コンピューティングについてはよくご存知かもしれませんが、次の「コンピューティング」についてはご存知ですか?

クラウドコンピューティングについては誰もがよくご存知だと思います。現在、ファイルストレージ、バックア...

大規模ウェブサイトの SEO 戦略を共有する

検索エンジン最適化では、SEO 戦略が最終的な最適化効果に影響します。 SEO 戦略は中小規模のウェ...

小さなテキスト、大きな体験:フォントが読書体験に与える影響の分析

iPadなどのモバイル端末の普及により、人々がモバイル端末で読書に費やす時間はますます長くなり、読書...

Google アナリティクスを設定するための 5 つのヒント

Google Analytics は、有名なインターネット企業 Google がウェブサイト向けに提...