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

推薦する

WeChatがWeChat Beansを追加:1元で7個、iOSのリチャージはiOSでのみ使用可能

iOS版WeChatアプリが正式版7.0.20にアップデートされ、若者モードや絵文字検索機能が追加さ...

新しいウェブサイトを立ち上げた後、Baidu ランキングを素早く獲得する方法

多くのウェブマスターにとって、新しいウェブサイトを立ち上げた後にランキングを獲得することは緊急の課題...

オラクルと呼ばれているから、何をしてもいいんですか?

注:この記事の原作者である Matt Asay は、Adobe の開発者エコシステムの責任者です。こ...

Baidu Webmaster Platform ハイエンドSEOクラブの第一回サロン活動の概要と共有

10月26日、百度ウェブマスタープラットフォームとMADconが共同で主催した百度ウェブマスタープラ...

コンテンツ、構造、形式 - ウェブサイト最適化の3つの要素とその他の側面

少なくともほとんどの Web サイトについては、これら 3 つの単語の順序も考慮しました。内容は心で...

SEO でピアを分析するための 4 つのヒント!

1. 競合他社のウェブサイトを訪問者として訪問し、ウェブサイトの情報を完全に理解します。 ( 1)競...

timeweb: 月額 16 元、ロシア VPS、200Mbps 無制限トラフィック、1G メモリ/1 コア/10g NVMe

timeweb(ロシアの信頼できるブランド、13年間運営)からの最新ニュース:価格は変更せずに、公式...

私の目から見たSEO - 人生の始まりを追うウサギ

SEO については、おそらく多くの人が聞いたことがあるでしょうが、それが何であるかを実際に知っている...

1つの投稿で年間数百万ドルを稼ぐ方法

中国で最も人気のあるフォーラムである Tianya Forum には、数え切れないほどの人気と、お金...

インターネットを活用してビジネスを最適化する

ほとんどの企業はインターネットを宣伝やマーケティングのチャネルとして利用しています。オンラインの世界...

馬華クラウド:香港CN2クラウドサーバー、1元から、1Gメモリ/1コア/50gSSD/2M帯域幅/5g防御

Mahua Cloudは現在、香港のクラウドサーバーのスーパーフラッシュセールを開催しており、香港C...

ftpit-2g メモリ/50g ハードディスク/1T トラフィック/月額 5 USD

ftpit は 2017 年 1 月に設立され、米国オハイオ州にオフィスを構えています。主にアンマネ...

東南アジアにおけるクラウドコンピューティングの発展方向は何ですか?

クラウド コンピューティングが万能薬ではないことを企業が認識するにつれ、新しいスキル、新しいアプリケ...

Kubernetes Gateway API が Ingress に勝る理由

オープンソースの Kubernetes Gateway API のリリースにより、ネットワーク In...

ウェブサイトのタイトルは戦略家にとっての戦場です。タイトル リソースの価値を高めるにはどうすればよいでしょうか?

タイトルはウェブサイトの最も重要なリソース要素です。タイトルはユーザーにとって最も目を引く要素です。...