本日より、「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 では、パフォーマンス チューニングは主にヒープ (新しい世代)、メソッド領域、スタックに対して実行されます。各リージョンのチューニングパラメータは次のとおりです。
より直感的な説明のために、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 パラメータを見てみましょう。もちろん、ここで示すのは経験的な値です。実際に本番環境に導入する場合は、最適なパラメータ値を見つけるためにストレス テストが必要になります。
Tomcat bin ディレクトリの catalina.sh ファイルで設定します。
Tomcat bin ディレクトリの catalina.bat ファイルで設定します。
要約する今日は、主に JVM の全体構造、JVM の分類、JVM の構成とチューニング パラメータなど、JVM の全体的なアーキテクチャとチューニング パラメータについて学習しました。 学びましたか?記事の最後にメッセージを残して、あなたの考えを共有してください。より良い洞察があれば、記事の最後にメッセージを残して、全員とコミュニケーションをとることもできます。 はい、今日はこれで終わりです。私はビンヘです。また次回お会いしましょう〜〜 この記事はWeChatの公開アカウント「Glacier Technology」から転載したものです。下のQRコードからフォローできます。この記事を転載する場合は、Glacier Technology 公式アカウントまでご連絡ください。 |
>>: 次世代サーバーレスプラットフォームKnativeの応用実践
Smarthostは古いブランドです。ここではSmarthostの大容量ハードディスクVPS(ストレ...
検索エンジンが開発されて以来、多くのアルゴリズムが公開されてきました。 SEO ER として、これを...
6月28日以来、SEOコミュニティで最も議論されているトピックは、禁止されたウェブサイトを復元する方...
長い間記事を書いていませんでした。最近とても忙しかったです。百度の頻繁な更新は、主要な草の根ウェブマ...
「製品には優れた機能があることが大切です。また、製品が簡単に習得でき、使いやすいことも重要です。しか...
1. 競合比較自社製品と競合他社製品を比較したり、価格の詳細を記載したダウンロード可能なドキュメント...
インド企業であるhostnamasteは、2017年にドメイン名を登録しました。同社は主にホスティン...
【小ソーシャルネットワーク】の設立当初、最初に発表するプロジェクトは北京大学と清華大学発の出会い系ア...
オープンソースソリューションのリーディングプロバイダーであるRed Hat, Inc. (NYSE:...
1. 概要分散ファイルシステムは分散分野における基本的なアプリケーションであり、最も有名なものは間違...
今年初め、BandwagonHostは米国西海岸のフリーモントデータセンターにChina Unico...
外部リンクの構築に関しては、A5には外部リンクを構築するための何百もの方法があります。ただし、すべて...
Redswitches は 6 歳だと言われていますが、実際のところはわかりません。現在はサーバーレ...
1. 中央銀行がオンライン決済監督の嵐を巻き起こし、アリババとテンセントの競争の内幕が明らかにこれは...
皆さんおはようございます。今日は週末です。杭州の多くの企業は休業していますが、ウェブサイトの最適化の...