1. JVMメモリ領域の分割 1.1 Java仮想マシンのランタイムデータ領域 Java 仮想マシンのランタイム データ領域配布図:
これらのうち、ヒープと JVM スタックは、次の理由によりプログラム操作の鍵となります。
では、なぜヒープとスタックを区別するのでしょうか?スタックにデータを保存できないのですか?
1.2 ヒープと JVM スタック: 1.2.1 ヒープ Java ヒープは、Java 仮想マシンによって管理される最大のメモリ空間です。物理的には不連続なメモリ空間にありますが、論理的には連続していれば十分です。主にさまざまなクラスのインスタンス オブジェクトを格納するために使用されます。この領域はすべてのスレッドで共有され、仮想マシンの起動時に作成されます。オブジェクトインスタンスを保存するために使用されます。ほぼすべてのオブジェクトと配列はここでメモリを割り当てます (スタック割り当てとスカラー置換最適化テクノロジを除く)。 Java では、ヒープは若い世代 (Young) と古い世代 (Old) の 2 つの異なる領域に分割されます。ヤングジェネレーションは、エデン、From Survivor (S0)、To Survivor (S1) の 3 つのエリアに分かれています。図に示すように: ヒープのメモリレイアウト: この分割の目的は、メモリの割り当てや回復など、JVM がメモリ内のオブジェクトをより適切に管理できるようにすることです。新世代はエデンと2人の生存者に分かれます。
1.2.2 スタック関連のパラメータ 注: ヒープ サイズは各 GC 後に調整されます。動的な調整によるパフォーマンスの低下を防ぐために、-Xms と -Xmx は通常同じに設定されます。 新世代の 3 つの設定パラメータの優先順位: -Xmn、-XX:NewSize、-XX:NewRatio: 1)。最高優先度: -XX:NewSize=1024m および -XX:MaxNewSize=1024m 2)。 2 番目に高い優先度: -Xmn1024m (デフォルトの同等の効果: -XX:NewSize==-XX:MaxNewSize==1024m) 3)。最低優先度: -XX:NewRatio=2 推奨されるパラメータは -Xmn です。これは非常に簡潔であり、NewSize と MaxNewSIze を一度に設定するのと同じであり、2 つが等しいためです。 1.3 JVM オブジェクト 1.3.1 オブジェクトの作成方法 各メソッドの実際の動作は次のとおりです。 1.3.2 JVMオブジェクトの割り当て 仮想マシン レベルでオブジェクトを作成する手順: 1.3.3 オブジェクトメモリ割り当て方法 オブジェクト メモリを割り当てるには、ポインタ衝突とフリー リストの 2 つの方法があります。 1) メモリが通常の場合は、仮想マシンはポインター衝突メソッド (Bump The Pointer) を使用してオブジェクトにメモリを割り当てます。つまり、使用済みのメモリはすべて片側にあり、空きメモリは反対側にあり、分割ポイントを示すポインタが中央にあります。メモリを割り当てるには、オブジェクトのサイズに等しい距離だけポインタを空き領域に移動するだけです。ガベージ コレクターが Serial や ParNew などの圧縮ベースのアルゴリズムを選択した場合、仮想マシンはこの割り当て方法を使用します。一般的に、ポインター衝突は、圧縮プロセスでコレクターを使用する場合に使用されます。 2) メモリが規則的ではなく、使用済みメモリと未使用メモリが混在している場合、仮想マシンはフリーリスト方式を使用してオブジェクトにメモリを割り当てます。つまり、仮想マシンは使用可能なメモリ ブロックを記録するためのリストを維持します。再割り当て時に、オブジェクト インスタンスに割り当てるのに十分な大きさの領域をリストから見つけ、リスト内のコンテンツを更新します。この割り当て方法は「フリーリスト」と呼ばれます。 注: 割り当て方法の選択は、Java ヒープが通常かどうかによって決まります。また、Java ヒープが通常かどうかは、使用するガベージ コレクターに圧縮機能があるかどうかによって決まります。 1.3.4 どのようなオブジェクトが古い世代に入ることができますか? 1.4 メモリの割り当てとリサイクル戦略 オブジェクトは最初に Eden に割り当てられます。ほとんどの場合、オブジェクトは新世代の Eden 領域に割り当てられます。 Eden 領域に割り当てるための十分なスペースがない場合、仮想マシンはマイナー GC を開始します。仮想マシンは、ガベージコレクションが発生したときにメモリ回復ログを印刷し、プロセス終了時に現在のメモリの各領域の割り当て状態を出力するための -XX:PrintGCDetails パラメータを提供します。 大きなオブジェクトは古い世代に直接送られます。いわゆるラージ オブジェクトとは、大量の連続したメモリ領域を必要とする Java オブジェクトを指します。最も一般的な大きなオブジェクトは、非常に長い文字列と配列です。仮想マシンは -XX:PretenureSizeThreshold パラメータを提供しており、この値より大きいオブジェクトを旧世代に直接割り当てることができます (この目的は、Eden 領域と 2 つの Survivor 間で大量のメモリ コピーを回避することです)。 長期間存続するオブジェクトは、古い世代のオブジェクト年齢カウンターに直接移動します。 -XX:最大テンリングしきい値 動的なオブジェクトの年齢の決定: 仮想マシンでは、オブジェクトを古い世代に昇格させる前に、必ずしもオブジェクトの年齢が MaxTenuringThreshold に達する必要はありません。 Survivor スペース内の同じ年齢のすべてのオブジェクトのサイズの合計が Survivor スペースの半分より大きい場合、その年齢以上のオブジェクトは、MaxTenuringThreshold で必要な年齢を待たずに、直接古い世代に入ることができます。 スペース割り当ての保証: マイナー GC が発生する前 (または発生後) に、仮想マシンは、以前の古い世代への昇格の平均サイズ (その時点で存続するオブジェクトの数が不確かなため、以前の平均値/経験値が採用される) が、古い世代の残りのスペース サイズより大きいかどうかを確認します。その場合は、代わりにフル GC が直接実行されます。小さい場合は、HandlePromotionFailure 設定で失敗の保証が許可されているかどうかを確認します。許可されている場合は、マイナー GC のみが実行されます。許可されていない場合は、代わりにフル GC も実行されます。比較のために平均値を取ることは、依然として動的確率法です。つまり、マイナー GC を生き残るオブジェクトの数が突然増加し、平均値よりもはるかに多い場合、それでも保証障害 (Handle Promotion Failure) が発生し、フル GC がトリガーされます。 2.1 参考文献 2 ガベージコレクションアルゴリズムの分類 2.2 GCルートオブジェクト 2.3 マークスイープ これは、現代のガベージ コレクション アルゴリズムの思想的基礎と見なされています。 マーク アンド スイープ アルゴリズムは、上の図に示すように、ルート セットからスキャンし、生き残ったオブジェクトをマークしてから、スペース全体でマークされていないオブジェクトをスキャンしてリサイクルします。マークスイープ アルゴリズムでは、オブジェクトの移動は必要なく、デッド オブジェクトのみを処理します。ライブオブジェクトが多数ある場合に非常に効率的です。ただし、マークスイープ アルゴリズムは使用済みのオブジェクトを直接リサイクルするため、メモリの断片化が発生します。 2.4 コピーアルゴリズム このアルゴリズムは、ハンドルのオーバーヘッドを克服し、ヒープ断片化のガベージコレクションを解決するために提案されました。これは、生きているオブジェクトが少なく、ガベージオブジェクトが多いという前提に基づいています。このアルゴリズムは、毎回使用中のオブジェクトのみを処理するため、コピーコストは比較的小さくなります。同時に、対応するメモリはコピー後にソートできるため、断片化の問題は発生しません。しかし、欠点も明らかです。つまり、メモリスペースが 2 倍必要になるということです。 最初にヒープをオブジェクト プレーンと複数のフリー プレーンに分割します。プログラムは、オブジェクト プレーンからオブジェクトにスペースを割り当てます。オブジェクトがいっぱいになると、コピー アルゴリズムに基づくガベージ コレクションがルート セットからアクティブ オブジェクトをスキャンし、各アクティブ オブジェクトを空きプレーンにコピーします (アクティブ オブジェクトによって占有されているメモリ間に空き領域がないようにするため)。このようにして、自由平面がオブジェクト平面になり、元のオブジェクト平面が自由平面になり、プログラムは新しいオブジェクト平面にメモリを割り当てます。対処アルゴリズムに基づく典型的なガベージ コレクションは、ヒープ領域をオブジェクト プレーンと空き領域プレーンに分割するストップ アンド コピー アルゴリズムです。オブジェクト平面と自由領域平面間の切り替え処理中は、プログラムの実行が中断されます。 2.5 Mark-Compact (または Mark-Compact、または MarkSweepCompact) このアルゴリズムは、「マークアンドスイープ」と「コピーアルゴリズム」の利点を組み合わせたものです。 「マークアンドスイープ」の断片化問題と「コピー」アルゴリズムのスペース問題を回避します。 マークスイープ アルゴリズムは、マークスイープ アルゴリズムと同じ方法を使用してオブジェクトをマークしますが、クリアする場合は異なります。残存していないオブジェクトによって占有されているスペースを再利用した後、残存しているすべてのオブジェクトは左側の空きスペースに移動され、対応するポインターが更新されます。マークスイープアルゴリズムは、マークスイープアルゴリズムに基づいており、オブジェクトの移動も行うため、コストは高くなりますが、メモリの断片化の問題を解決します。コンパクト化アルゴリズムに基づくコレクターの実装では、通常、ハンドルとハンドル テーブルが追加されます。 2.6 世代を超えた収集 異なるオブジェクトのライフサイクルは異なるという事実に基づきます。したがって、ライフサイクルの異なるオブジェクトには異なるリサイクル アルゴリズムを採用して、リサイクル効率を向上させることができます。 新しい世代のオブジェクトの生存時間は短く、頻繁な GC が必要なため、より効率的なレプリケーション アルゴリズムが使用されます。メモリ領域は、1 つのエデン領域と 2 つのサバイバー領域に分かれています。エデンエリアとサバイバーエリアのデフォルトの比率は 8:1 です。メモリを割り当てるときは、まずeden領域が割り当てられます。エデン領域がいっぱいになると、GC のレプリケーション アルゴリズムを使用して、生き残ったオブジェクトをサバイバー領域にコピーします。残存領域がいっぱいになると、残存オブジェクトは別の領域にコピーされます。オブジェクトの生存時間が一定のしきい値を超えると、そのオブジェクトは古い世代に配置されます。古い世代と永続的な世代では、オブジェクトが長期間存続するため、マークスイープ アルゴリズムまたはマークコンパクト アルゴリズムが使用されます。 要約: 新世代:レプリケーション アルゴリズム(新世代のリサイクルの頻度は非常に高く、各リサイクルには短い時間がかかります。高頻度の新世代のリサイクルをサポートするために、仮想マシンはカード テーブルと呼ばれるデータ構造を使用する場合があります。カード テーブルはビットのセットであり、各ビットを使用して、古い世代の特定の領域内のすべてのオブジェクトに新世代のペアがあるかどうかを示すことができます。 2.7 ガベージコレクター ガベージ コレクターのタスクは、メモリのクリーンアップのためにガベージ オブジェクトを識別してリサイクルすることです。世代によって使用できるコレクターは異なります。
要約:
3. GC実行メカニズム Java のヒープ (deap) も、GC がガベージを収集する主な領域です。オブジェクトは世代ごとに処理されるため、ガベージコレクションの領域と時間も異なります。 GC には、スカベンジ GC (マイナー GC) とフル GC (メジャー GC) の 2 種類があります。
3.1 フルGC実行をトリガーするシナリオ 3.2 Young GCのトリガー条件 3.3 新しいオブジェクトのGC回復プロセス 新しく作成されたオブジェクトのほとんどが GC で再利用されるという前提に基づいています。新世代の GC では、コピー アルゴリズムが使用されます (若い世代は 3 つの部分に分かれており、主にライフ サイクルの短いオブジェクトをできるだけ若い世代に保持します。古い世代には、キャッシュなどのライフ サイクルの長いオブジェクトが主に格納されます)。可能なプロセス:
3.4 GCログ GC ログ関連のパラメータ:
ケーススタディ: -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime を一緒に使用する アプリケーション時間: 0.3440086 秒 アプリケーション スレッドが停止した合計時間: 0.0620105 秒 アプリケーション時間: 0.2100691 秒 アプリケーション スレッドが停止した合計時間: 0.0890223 秒 アプリケーションは最初の 344 ミリ秒間は実際の作業を実行し、その後 62 ミリ秒間すべてのスレッドを一時停止し、さらに 210 ミリ秒間作業を実行し、その後さらに 89 ミリ秒間一時停止したことがわかります。 2796146K->2049K(1784832K)] 4171400K->2049K(3171840K)、[メタスペース: 3134K->3134K(1056768K)]、0.0571841 秒] [時間: ユーザー=0.02 システム=0.04、実=0.06 秒]アプリケーション スレッドが停止した合計時間: 0.0572646 秒、スレッドの停止にかかった時間: 0.0000088 秒 アプリケーション スレッドは、ガベージ コレクションを実行するために 57 ミリ秒間強制的に一時停止されました。このうち 8 ミリ秒は、すべてのアプリケーション スレッドが安全なポイントに到達するまで待機するために使用されます。 -XX:+PrintGCDetailsを設定すれば、自動的に-verbose:gcと-XX:+PrintGCが設定されます。 33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 秒] 3324K->152K(11904K), 0.0031680 秒]100.667: [フル GC [Tenured: 0K->210K(10240K), 0.0149142 秒] 4603K->210K(19456K), [Perm: 2999K->2999K(21248K)], 0.0150007 秒] [時間: ユーザー=0.01 システム=0.00、実=0.02 秒]
3.5 GCオーバーヘッドを削減するための対策 コードから: JVM パラメータのチューニングから: 3.6 メモリオーバーフローの分類 IV.概要 - JVM チューニング関連 4.1 チューニングの目的 4.2 JVMパフォーマンスチューニングのレベル 4.3 JVM チューニング プロセス 4.4 パフォーマンス監視ツール チューニングの最終的な目標は、アプリケーションが最小限のハードウェア消費でより高いスループットを実現できるようにすることです。 JVM チューニングも例外ではありません。 JVM チューニングは主にガベージ コレクターの収集パフォーマンスを最適化し、仮想マシン上で実行されるアプリケーションが使用するメモリとレイテンシを削減して、スループットを向上させることを可能にします。 |
>>: クラウドネイティブの台頭に役立つ2020年のトップ8オープンソースツール
私は、前四半期のLEBでトップランクのVPSプロバイダーであるPrometeusからVPSを購入する...
あっという間に、中国で4Gライセンスが発行されてから1年が経ちました。嬉しい驚きだったのは、3Gライ...
最近、上都路と十里埔街の交差点にある汴良大湯餃子店の店長の何六柱さんは心配していることがある。×紅偉...
過去 1 年間で、長年にわたり実装されてきたテクノロジー ロードマップの実現が加速し、デジタル変革を...
Baidu は検索分野とテクノロジーに非常に強い企業であり、今後さらに発展していくことは間違いありま...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています豆腐が好き...
Alipayは、2013年12月3日より、コンピューター上のAlipayアカウント間の送金に手数料が...
2020年1月19日、WeChatチームは広州で毎年恒例のWeChat Open Class PRO...
私は長年、ローカル Web サイトに取り組んできました。今日は、ローカル Web サイトのオンライン...
最近のほとんどのウェブサイトにはソーシャル共有ボタン機能が追加されており、これはほぼ分子拡散のトレン...
クラウド コンピューティングと大規模分散システムの台頭により、Java マイクロサービス アーキテク...
音楽ダウンロードの「無料ランチ」の終焉に関する最近の議論に関して、記者は昨日、テンセントのQQミュー...
皆さんは、以前の百度Kステーション事件に深い印象を持っていると思いますよね?医療業界のサイト、タオバ...
過去 2 年間で、多くのインターネット製品が、さまざまなデバイスやブラウザの制限を克服するためにレス...
債務型クラウドファンディングP2Pの急速な発展に加えて、株式型クラウドファンディング、リターン型クラ...