JVM 全体のアーキテクチャとチューニングパラメータの説明

JVM 全体のアーキテクチャとチューニングパラメータの説明

[[421897]]

本日より、「Advanced Architect Series」の技術記事の更新を正式に開始いたします。 「上級アーキテクトシリーズ」では、まずJVMに関する知識について説明します。

多くの友人は、JVM の知識は難しくて退屈で、どのように学習すればよいかわからないと考えています。 JVM に関する本をたくさん買っても、数ページ読んだだけで読めなくなり、本棚に置いてほこりをかぶらせてしまいます。

実際、インターネット業界では、基礎となるコア知識を習得した人が、激しい競争環境の中で目立つ存在になるでしょう。 JVM は難しそうに見えますが、JVM の学習ルールと方法をマスターし、十分に理解すれば、実は非常に簡単です。

さまざまなプログラミング言語、開発テクノロジー、分散およびマイクロサービス アーキテクチャ、分散データベース、分散トランザクション、クラウド ネイティブ、ビッグ データおよびクラウド コンピューティング テクノロジー、および侵入テクノロジーを共有します。さらに、さまざまな面接の質問や面接のヒントも共有されます。

記事の全体的な構成

この記事では、以下の構成に従って、JVM の全体的なアーキテクチャとチューニング パラメータを紹介します。

JVMの分類

ここではまず、VM とは何かについて説明します。 VM の中国語の意味は「仮想マシン」であり、完全なハードウェア システム機能を備え、完全に分離された環境で実行される完全なコンピュータ システムをシミュレートするためにソフトウェアを使用することを指します。これは物理マシンのソフトウェア実装です。

一般的に使用される仮想マシンには、VMWare、Virtual Box、Java 仮想マシン (JVM) などがあります。

ここでは、JVM (Java 仮想マシン) に焦点を当てます。下の写真をご覧ください。

この絵は比較的シンプルに見えます。 JVM はオペレーティング システム上で実行され、オペレーティング システムはコンピューターのハードウェア上で実行されます。

JVM に関しては、実際には多くの大手メーカーがさまざまなバージョンの JVM を開発しています。よく知られているものとしては、Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Harmony、Google Dalvik VM、Microsoft JVM などがあります。

現在広く使用されている JDK8 バージョンは、Sun HotSpot VM と BEA JRockit VM が統合されて開発された JDK バージョンです。

JVM構成

JVM は主に、クラス ローダー サブシステム、ランタイム データ領域 (メモリ構造)、バイトコード実行エンジンの 3 つのサブシステムで構成されています。

JVM をより深く理解するために、JVM の全体像を見てみましょう。

Java プログラムを開発する場合、まず .java ファイルを作成し、次に .java ファイルを .class ファイルにコンパイルします。

JVM では、.class ファイルの内容がクラス ローディング サブシステムを介して JVM のランタイム データ領域にロードされ、JVM のランタイム データ領域はメソッド領域、ヒープ、スタック、ローカル メソッド スタック、プログラム カウンターの複数の部分に分割されます。

クラス ファイルの内容をロードする場合、クラス ファイルの内容は複数の部分に分割され、それぞれ JVM ランタイム データ領域の複数の部分にロードされます。その中でも、プログラム カウンターの機能は、プログラムによって実行される次の命令のアドレスを記録することであることは注目に値します。

メソッド領域はメタスペースとも呼ばれ、主にランタイム定数プール、型情報、フィールド情報、メソッド情報、クラスローダー参照、対応するクラスインスタンス参照などの情報が含まれます。

JVM では、プログラムの実行は実行エンジンを通じて行われ、実行エンジンはネイティブ メソッド インターフェイスを呼び出してネイティブ メソッド ライブラリを実行し、それによってプログラム ロジック全体の実行が完了します。

よく話題になるガベージ コレクターは実行エンジンに含まれています。プログラムの実行中、実行エンジンはガベージ コレクターを起動し、バックグラウンドで実行します。ガベージ コレクターは、プログラムの実行中に生成されたメモリ ガベージ情報を継続的に監視し、対応する戦略に従ってガベージ情報をクリーンアップします。

ここで、誰もが次の点に注意する必要があります。スタック、ローカル メソッド スタック、プログラム カウンターは実行時に各スレッド専用ですが、メソッド領域とヒープはすべてのスレッドで共有されます。したがって、スタック、ローカル メソッド スタック、およびプログラム カウンターにはスレッド セーフティの問題はありませんが、メソッド領域とヒープにはスレッド セーフティの問題があります。

メソッド領域(メタスペース)

多くの友人が「メソッド領域」という 3 つの単語を見ると、最初に思い浮かぶのはメソッドが格納されている場所かもしれません。

実際、メソッド領域の別名はメタスペースです。皆さんの多くは、メタスペースについてある程度聞いたことがあると思います。この領域は JDK1.8 で分割されました。主に、ランタイム定数プール、型情報、フィールド情報、メソッド情報、クラスローダー参照、対応するクラスインスタンス参照などの情報が含まれます。メソッド領域の情報は複数のスレッドで共有できます。

たとえば、プログラム内で宣言された定数、静的変数、クラス情報への参照はすべてメソッド領域に格納され、これらの参照によって指される特定のオブジェクトは通常、ヒープ内の別の領域に格納されますが、直接メモリに格納される場合もあります。

ヒープ

ヒープには、実際に作成されたオブジェクト、つまり new キーワードによって作成されたオブジェクトが主に格納されます。ヒープ内のオブジェクトは複数のスレッドで共有できます。ヒープ内のデータは事前​​に明確な有効期間を持つ必要がなく、メモリを動的に割り当てることができます。使用されなくなったデータとオブジェクトは、JVM の GC メカニズムによって自動的に回収されます。 JVM パフォーマンス チューニングには通常、ヒープ メモリのチューニングが含まれます。

Java の基本型 (Byte、Short、Integer、Long、Float、Double、Boolean、Character 型データ) のラッパー クラスがヒープ内に格納されます。

ヒープは一般的に若い世代と古い世代に分けられます。若い世代はさらに 1 つのエデン エリアと 2 つのサバイバー エリアに分割されます。メモリ割り当てに関しては、デフォルト構成が維持されている場合、若い世代と古い世代のメモリサイズ比は 1:2 であり、若い世代の 1 つの Eden 領域と 2 つの Survivor 領域のメモリサイズ比は 8:1:1 です。

スタック

スタックは一般的にスレッド スタックまたは仮想マシン スタックと呼ばれ、通常はローカル変数を格納します。 Java では、各スレッドには個別のスタック領域があり、各スタック内の要素はプライベートであり、他のスタックからアクセスすることはできません。スタック内のデータサイズと存続期間は固定されており、アクセス速度は比較的高速です。

Java では、すべての基本データ型 (byte、short、int、long、float、double、boolean、char) と参照変数 (オブジェクト参照) がスタック上にあります。通常、スレッドまたはメソッドが終了すると、スタック内のデータは自動的にクリアされます。

プログラムの実行中に、スタック内にメソッドごとに異なるスタック フレームが作成されます。スタック フレームには、ローカル変数テーブル、オペランド スタック、動的リンク、メソッド終了が含まれます。

ローカル変数テーブル、オペランド スタック、動的リンク、メソッド終了の具体的な機能については、Advanced Architect シリーズの今後の記事で詳しく説明します。

スタックには通常、オブジェクトへの参照が格納されます。これらの参照によって指し示される特定のオブジェクトは、通常、ヒープ内の別のアドレス空間に格納されますが、直接メモリに格納される場合もあります。

注: ここで言及されているのは、これらの参照によって指し示される特定のオブジェクトは、通常、ヒープ内の別のアドレス空間に格納されるか、または直接メモリに格納される可能性があるということです。

JVM では、エスケープ解析とスカラー置換がオンになっていると、ヒープ上にオブジェクトが作成されなくなり、オブジェクトがスタックに直接割り当てられる可能性があるためです。または、オブジェクトは作成されなくなりますが、オブジェクト内のメンバー変数がさらに分解され、スタック上に直接スペースが割り当てられ、値が割り当てられる場合があります。

ネイティブメソッドスタック

ローカル メソッド スタックは比較的単純で、ネイティブ メソッド エントリ領域のアドレスを保存します。

たとえば、Java でスレッドを作成し、Thread オブジェクトの start() メソッドを呼び出すと、ローカル メソッド start0() を通じてオペレーティング システムのスレッド作成メソッドが呼び出されます。この時点で、ローカル メソッド スタックは、start0() メソッドが入る領域のメモリ アドレスを保存します。

プログラムカウンタ

プログラム カウンター (PC カウンターとも呼ばれます) は、主に次に実行されるコマンドのアドレスを格納します。

JVM チューニングパラメータ

JVM では、パフォーマンス チューニングは主にヒープ (新しい世代)、メソッド領域、スタックに対して実行されます。各リージョンのチューニングパラメータは次のとおりです。

  • ヒープ: -Xms、-Xmx
  • 新世代: -Xmn
  • メソッド領域 (メタスペース): -XX:MetaspaceSize、-XX:MaxMetaspaceSize
  • スタック(スレッド): -Xss

より直感的な説明のために、JVM のメモリ領域と対応するチューニング パラメータを次の図のようにまとめます。

JVM 起動パラメータを設定するときは、メソッド領域 (メタスペース) のパラメータ設定に特に注意する必要があります。

メソッド領域 (メタスペース) には、-XX:MetaspaceSize と -XX:MaxMetaspaceSize という 2 つの主要な JVM パラメーターがあります。

-XX:MetaspaceSize: フル GC をトリガーするメソッド領域 (メタスペース) の初期メモリ サイズ (バイト単位) を示します (メソッド領域の初期メモリ サイズは固定されていません)。デフォルトは 21M です。設定された値に達すると、Full GC がトリガーされ、ガベージ コレクターがこの値を変更します。

Full GC が発生したときに大量のメモリ領域が再利用される場合、ガベージ コレクターはこの値のサイズを適切に縮小します。フル GC が発生したときに解放されるスペースが少ない場合、この値は、設定された -XX:MetaspaceSize 値を超えずに適切に増加されます。また、-XX:MetaspaceSize 値が設定されていない場合は 21M を超えないように増加されます。

-XX:MaxMetaspaceSize: メソッド領域 (メタスペース) の最大値を参照します。デフォルト値は -1 であり、ヒープ メモリ サイズによって制限されません。現時点では、ローカル メモリのサイズによってのみ制限されます。

最後に、メソッド領域 (メタスペース) のサイズを調整すると、非常にコストのかかる操作である Full GC が発生することに注意することが重要です。アプリケーションの起動時に Full GC が発生する場合は、メソッド領域 (メタスペース) のサイズが動的に調整されている可能性が非常に高くなります。

そのため、JVM がメソッド領域 (メタスペース) のサイズを動的に調整して Full GC が頻繁に発生するのを防ぐために、-XX:MetaspaceSize と -XX:MaxMetaspaceSize は通常同じ値に設定されます。例えば、物理メモリが8Gの場合、これら2つの値を256Mに設定できます。

最後に、8G の物理メモリでアプリケーションを起動するときに設定できる JVM パラメータを見てみましょう。もちろん、ここで示すのは経験的な値です。実際に本番環境に導入する場合は、最適なパラメータ値を見つけるためにストレス テストが必要になります。

  • SpringBootを起動する
  1. java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar xxx.jar
  • Tomcat を起動する (Linux)

Tomcat bin ディレクトリの catalina.sh ファイルで設定します。

  1. ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:メタスペースサイズ=256M ‐XX:最大メタスペースサイズ=256M
  • Tomcat を起動する (Windows)

Tomcat bin ディレクトリの catalina.bat ファイルで設定します。

  1. ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:メタスペースサイズ=256M ‐XX:最大メタスペースサイズ=256M

要約する

今日は、主に JVM の全体構造、JVM の分類、JVM の構成とチューニング パラメータなど、JVM の全体的なアーキテクチャとチューニング パラメータについて学習しました。

学びましたか?記事の最後にメッセージを残して、あなたの考えを共有してください。より良い洞察があれば、記事の最後にメッセージを残して、全員とコミュニケーションをとることもできます。

はい、今日はこれで終わりです。私はビンヘです。また次回お会いしましょう〜〜

この記事はWeChatの公開アカウント「Glacier Technology」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、Glacier Technology 公式アカウントまでご連絡ください。

<<:  クラウドウェブホスティングのメリット

>>:  次世代サーバーレスプラットフォームKnativeの応用実践

推薦する

Baidu サイト アプリ トライアル: 独自の Web サイトを Web アプリに変える

序文このタイトル全体を見ると、多くの人が「Web アプリとは何ですか? Baidu サイト アプリと...

2023年、クラウドコンピューティングの方向性は変化した

2022 年はクラウド コンピューティングにとって「転換点」となる年です。過去2年間の好況と比較する...

#無料: vultr-8g メモリ/110g ハードディスク/10t トラフィック/10g ポート/DDOS 保護

これまで共有リソースの VPS を使用していました。専用リソースの VDS を試してみませんか? お...

QQスペースを使用してユーザーを保存します

あなたのウェブサイトのトラフィックはどれくらいですか? かなり多いかもしれませんが、ウェブサイトのリ...

ガートナーは、組織によるクラウド移行の加速がパブリッククラウド支出の急増につながると予測している

[[396264]]分析会社ガートナーが発表した最近の調査および予測データによると、パブリッククラウ...

淘宝特別価格版がWeChatミニプログラムで利用可能になりました。希望はありますか?

最近、アリババがテンセントWeChat上でタオバオ特別版ミニプログラムを立ち上げ、特定のシナリオでタ...

A5 最適化チーム: ランキングが乱高下する中、SEO 最適化はどこに向かっているのでしょうか?

2012年に入ってから、検索エンジンの順位変動が異常に頻繁になった。権威の低いウェブサイトが一夜にし...

Zhiqubaichuan: SCRMマーケティング自動化ソリューションのリーダー

[51CTO.com からのオリジナル記事] 大きな変動から利益を得ることは生物学の究極の能力です。...

Zhiliao Cloud - 香港 CN2 専用回線、プロフェッショナル OpenStack クラウド ホスティング、年間支払いは 298 元から

2009年に設立された智寮クラウド(zllyun)は、重慶順迪ネットワークテクノロジー株式会社と重慶...

クラウドコンピューティングの最新動向とエンタープライズビジネスの今後の展開

調査会社 IDC の INO 調査チームのディレクターである Matt Eastwood 氏は最近、...

天猫は激怒し「禁止命令」を発令し、販売業者は「どちらかの側につく」ことを余儀なくされた。

今はチャネルが王様の時代です。発言権を持つチャネルディーラーの前では、サプライヤーは不利な立場に置か...

マーケティングはトウモロコシを摘むサルのようなものではありません。意味と形式を伴うマーケティングが効果的です。

数日前、見知らぬ人からの思いがけないメールとブログのメッセージに心を動かされ、深い考えに陥りました。...

3B戦争の初対決:李延紅と周紅義の古い恨みと新たな憎しみ

周紅一氏の検索エンジン「Qihoo 360」は、リリースから10日以上が経過し、大きな成功を収めた。...

SEO専門家の最適化戦略は外部リンクだけではない

SEO プロジェクトの計画には何が含まれますか?現在のクライアントの Web サイトに適した SEO...

ガートナーの2022年クラウドプラットフォームサービスのハイプサイクルでは、2年以内に実用化が成熟する2つのテクノロジーが特定されています。

ガートナーの 2022 年クラウド プラットフォーム サービス テクノロジー ハイプ サイクルによる...