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

推薦する

2013 年の貧弱なウェブマスターのウェブサイト運営のアイデア

ウェブサイトの運用は、すべてのウェブマスターが常に考え、探求しているウェブサイト構築の問題です。最適...

検討に値する 5 つのオープンソース クラウド監視ツール

IT チームが低コストでロックインのないクラウド監視ツールを必要としている場合、オープンソースは最適...

Archhosting ロサンゼルス クアドラネット データセンター 高品質 VPS レビュー、ウェブサイト構築に適しています + x

ここで、Quadranet データセンター VPS を販売している、より良心的な業者、archost...

李佳琦はタオバオを救えるのか?

ライブストリーミング電子商取引インフルエンサー第1位のViyaが脱税の疑いで調査を受けた後、電子商取...

SEOは困難の中に喜びを見出すことを学ぶべきだ

私は数年にわたって SEO に携わってきましたが、オンライン マーケティングに SEO テクノロジー...

ローカルポータルの宣伝方法と各段階での重点

1. ポータル運営の初期推進2. ポータル運営の中期的推進3. ポータル運用後のプロモーション***...

chicagovps 最後の狂気 (SSD 付き)

chicagovps からメールを受け取りました。今年も終わりに近づいていますが、chicagovp...

VMware Tanzu®ポートフォリオは、顧客によるクラウドネイティブアプリケーションの構築、実行、管理を支援します。

従来のアプローチでは、今日のビジネスに求められる競争上の優位性と迅速なイノベーションを実現できないた...

Baiduの外部リンク判定の解釈:良い外部リンクとはどのような外部リンクか

百度は4月末に外部リンク判定に関する記事を発表し、ウェブサイトの外部リンクに対する百度の姿勢を明らか...

Ceph の運用と保守では、オープンソースの分散ストレージを制御する方法について説明します。

過去 2 年間、私の主な仕事は Hadoop テクノロジー スタックでしたが、最近 Ceph に触れ...

毎日の話題:Baiduは最近、ウェブマスターを調整し、独創性とページの品質にもっと注意を払うようにしました

ウェブマスターネットワーク(www.admin5.com)が5月20日に伝えたところによると、百度は...

hostvenom-$49/E3-1230v2/8g メモリ/500g ハードディスク/1Gbps/安定したコンピュータ ルーム

Hostvenom では、価格性能比に優れた専用サーバーの特別プロモーションを実施しています。シカゴ...

プロフェッショナルなウェブサイト構築で理解しなければならないターゲット課題

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