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は合意に従うと語る

推薦する

ウェブサイトのトラフィック統計分析についてもう一度お話しします

人生日記には、喜び、悲しみ、怒り、幸せ、そして成長体験を記録できます。では、ウェブサイトのトラフィッ...

Citrix パフォーマンスの問題をトラブルシューティングする方法

仮想デスクトップ環境ではパフォーマンスの問題が発生することがよくありますが、これらの問題を防ぐ方法は...

ウェブサイトの内外からウェブサイトのランキングに影響を与える要因を分析する

ウェブサイトのランキングに影響を与える要因については、インターネット上にすでに多くのコンテンツがある...

fapvps-1G メモリ KVM/SSD ハードディスク/月額 6.99 ドル

fapvps、この VPS プロバイダーに関して、Hostcat は関連する紹介情報を見つけることが...

Kubernetes がアプリケーションに適しているかどうかを判断する 5 つの方法

多くの場合、アプリケーションの最新化への道筋は次のようになります。まず、アプリケーションをマイクロサ...

金融クラウド分裂:規制当局が自ら16の金融機関を率いてクラウドサービス会社を設立

金融クラウド分野では、静かに核分裂が起こりつつある。記者は、中国銀行業監督管理委員会が自ら監督を担当...

Hostsolutions - 年間 10 ユーロ / ルーマニア 1G RAM VPS、月間 5TB のトラフィック

ルーマニアの VPS 販売業者である Hostsolutions は、著作権を軽視し、価格が安いこと...

SEO 担当者が知っておくべき 9 つの検索エンジン アルゴリズムの分析!

検索エンジンが開発されて以来、多くのアルゴリズムが公開されてきました。 SEO ER として、これを...

分散型のマルチアクティブ データ センターは、DNS ドメイン名解決と負荷分散をどのように実装するのでしょうか?

今日のトピックでは、アクティブ/アクティブ データ アクセスの観点から、ドメイン名解決と負荷分散につ...

Seoer: あなたはまだBaidu BR値について迷信的ですか?

最近、いくつかのウェブサイトと友好的なリンクを交換するときに、「あなたのウェブサイトのPR値とBai...

ウェブサイトのランキングの速さと長期的な安定性の違い

SEO担当者によって、ウェブサイトのランキングに対する理解は異なります。多くの人は、キーワードランキ...

IoTの成長が牽引するエッジコンピューティングの4つの垂直アプリケーション

データは今日の経済の生命線であり、あらゆる業界の企業が顧客に優れた、よりパーソナライズされたエクスペ...

errantweb-2g メモリ VPS (vz)/1g メモリ (KVM) 月額 6 ドル

errantwebは2017年1月に設立されました。価格が安く、リソースが豊富です。データセンターは...

servercheap-2 USD/1G RAM/50G SSD/3T トラフィック/シカゴ

比較的新しい VPS プロバイダーである ServerCheap.net は、月額わずか 2 ドルで...

世界の電子商取引の成長予測

市場調査会社eMarketerは最近、2018年に電子商取引の成長が最も速い世界トップ10カ国のうち...