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

推薦する

SEOへの道はそんなに簡単ではない。

私はウェブサイトの構築を6~7年、SEOを4~5年研究してきましたが、インターネット技術や検索エンジ...

外部リンク運用サイクルに影響を与える要因は何ですか?

外部リンクは、ウェブサイトの最適化において非常に重要な要素です。外部リンクは、ウェブサイトの重みを蓄...

分散ストレージについて知っておくべきこと(写真とテキスト付き)

序文分散ストレージのリスクは、実際には、「共有」、「大容量データ」、「高性能」と、キャリアとしての ...

ASO最適化とプロモーションの総合ガイド、ダウンロード数を2倍にしたAPPプロモーションの実践的なヒントを共有!

3か月で、私はASOの完全な初心者から基本的な知識を身につけました。ASOに関する記事を100以上読...

現代の企業が企業の俊敏性を向上させる必要がある理由

1990 年代初頭、「現代のビジネス プラクティス」という用語は、一般的に「リアルタイム」配信システ...

ERP はパブリック クラウド上に存在できないと誰が言ったのでしょうか? Kingdee Cloud Serverless ERP が AWS でリリース

[51CTO.com からのオリジナル記事] パブリック クラウドは、その弾力性と拡張性により、多く...

サーバー側における高並列分散アーキテクチャの進化

1. 概要この記事では、Taobao を例に、同時ユーザー数が 1 億人から数千万に及ぶサーバー側ア...

Qiniu Cloud Storage 2.0、第2世代のビッグデータストレージは素晴らしい

Qiniu Cloud Storageは、新しいアーキテクチャと消失訂正符号算術冗長技術を備えた第2...

Weiboを使ってお店を宣伝する方法

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスWeiboマーケティング...

3 つの文章でブランド コミュニケーションとマーケティングを理解しましょう。

このツイートは、普及について話すことから始まります。このツイートを読んだ後、ブランド コミュニケーシ...

SEO とブランディングは相反するものですか?それとも、この 2 つは互いに補完し合うのでしょうか?

現在のSEOの傾向は、2011年の同時期よりもはるかに実用的です。誰もがテクノロジーに集中しているわ...

国内の動画サイトは再編されつつあり、サイトの同質化により競争が激化するだろう

業界関係者によると、海外の動画サイトは差別化を図りながら共存しているが、国内の動画サイトは今後さらに...

企業はクラウドへの早送りボタンを押し、デジタルトランスフォーメーションがクラウドコンピューティングの急速な発展を推進します。

オンライン教育、リモートワーク、クラウド医療、クラウド授業...クラウドコンピューティングの応用シナ...

エッジからクラウドへの進化における4つの課題

世界中の組織は、毎日生成される前例のない量のデータによってますます困難に直面しています。モノのインタ...

Sogouナビゲーションウェブサイトにニュースを掲載すべき理由の分析

筆者はSogou Browserを使用しているため、当然そのナビゲーションWebサイトを使用します。...