メーカーによるインタビュー:あなたがオンラインJVMの話をするにはどうすればよいが最適化されていますか?

JVM(Java仮想マシン)は、JVMでのプログラマとしてのネジが、実際にはほとんどそれを理解するJavaコードインタプリタを実行するだけで、内部JVMができ、まだ書き込み品質コードの詳細を知りません!しかし、あなたがJVMを理解していないビルドロケットのシーン、航空機(面接)は、インタビュアーが深刻な虐待になり、この問題は、JVMは、一般的な面接の質問に記載されています:

  1. JVMメモリモデルの外観のように言いましたか?
  2. オブジェクトを復元することができますか?
  3. 何を、どのような長所と各共通ガベージコレクタアルゴリズムの欠点?
  4. オブジェクトは、歳入ると?
  5. 保証スペース割り当ての戦略は何ですか?
  6. フルGCの削減を最適化するには?

この大きな波JVM面の質問に直面して、あなたは本当にそれがホールド生きますか?

以下のようなJVMメモリモデルを見て?

JVMメモリモデルは、大きく分けることができるスレッドプライベート領域共有領域、仮想マシンのスタック、ネイティブメソッドスタック、プログラムカウンタによるスレッドのプライベート領域、および共有ヒープ領域、メタデータ領域(面積法)組成物による。

その後、誰かがあなたがチャートのトップに思い出すが、仕事をしませんJVMのメモリ・モデルの道を知っているだけでなく、彼らが何をしているか知っているJVMのメモリ・モデルを尋ねました。

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

あなたが遭遇した場合StackOverflowException、この例外は、何があるときなぜ思考の下で、このような例外はありませんか?スタックの仮想マシンでの回答の嘘は、JVMの方法は、それぞれに生成されるスタックフレームスタックフレームは、仮想マシンのスタックに押し込まれます。

栗のために:と仮定JVMパラメータ-Xssセット1m、128キロバイトの配列を作成し、この方法は、同じスレッド再帰的に4倍とすることができる方法は、再帰的第五の時間が報告される場合StackOverflowException、仮想マシンので、異常をスタックサイズは1メートル、各再帰的な方法は、それはスペースの不足の表示に5回目である仮想マシン128キロバイトスタック内のスペースを割り当てる必要があります。

プログラムカウンタ

プログラムカウンタは、現在のスレッドによって実行される行番号指示子記録バイトコードです。マルチスレッドは、CPU、ラウンドロビンアルゴリズムが実装されている(すなわち、交互スレッド及び割り当て処理の実行時間を切り替える)ことにより、JVMです。言い換えれば、スレッドが別のスレッドのタイムスライスを始めるためにしながら、実装プロセスに懸濁されたタイムスライスを使い果たす可能性があるため。

簡単に言えば、プログラムカウンタの主な機能はしている、現在のスレッドで実行される行番号インジケータバイトコードを記録します

メソッド領域(メタデータ領域)

メタデータ情報クラス、静的変数、定数および他のデータの格納方法。

ヒープ(ヒープ)

私たちは、通常使用newヒープに入り、GCヒープ領域は、ケアの焦点であるキーワードオブジェクトを作成するために、ヒープはに分割されます:新世代、古い時間が、新しい世代はさらにエデンエリアとサバイバーのエリアに分割されます。

新しいJVMコレクションアルゴリズムに従ってエデンエリアとサバイバー地区の生成、しかし、ほとんどのそれらの使用されている世代の回復アルゴリズムを、ので、新しい世代を導入するための時間は、直接ヒープサバイバーとエデンDistrict地区のように要約されます。

概要

JVMのメモリ・モデルの概要:

  • JVMのメモリ・モデルは、分割されたスレッド・プライベートエリア共有エリア
  • VMスタック/ネイティブメソッドスタックストアスレッドの実装を担当してメソッドのスタックフレーム
  • 実行命令のスレッドのプログラムカウンタの位置を記録します
  • メソッド領域(メタデータ領域)メタデータ情報ストレージクラス静的変数、定数およびその他のデータ
  • ヒープ(ヒープ)使用newキーワードオブジェクトを作成するには、ヒープに入り、ヒープは古いものと新しい世代の分割され

オブジェクトを復元することができますか?

2つの方法でJVM回復決意対象:参照カウントGCルーツ JVMが維持各オブジェクトに対して、単純な参照カウント、参照カウントがゼロの参照カウントは、オブジェクトAはないタスク記述されたオブジェクトの参照オブジェクトA、オブジェクトAないことであると仮定されますこれは、リサイクルすることができますが、参照カウントは、循環参照の問題を解決することはできませんという欠点を有しています。

GCルーツという名前の一連のGCルーツ基準パスと呼ばれるノードから下方に検索を開始するために、出発点として、オブジェクトは、オブジェクトがGCのルーツへの参照が参加、それはオブジェクトことが証明されている連鎖していない場合、チェーンを検索しました利用できません。

Javaでは、オブジェクトは、次のカテゴリのGCルーツとして使用することができます。

  • VMスタックオブジェクト参照。
  • 静的クラスの属性参照内のオブジェクトのメソッド。
  • オブジェクトメソッド一定の基準領域と
  • JNIネイティブメソッドスタックに参照されたオブジェクト(すなわち、一般的にはネイティブメソッドを前記)。

概要

オブジェクトがで一般的である場合にはGCのルーツオブジェクトが回収できることを示す、以下の検索が、回復はGCの気分に依存したときに!

何を、どのような長所と各共通ガベージコレクタアルゴリズムの欠点?

クリアラベル

このアルゴリズムは、2つのポイントに分けられる:スキャンが完了した後に明らか二段階、マーキング、マークフェーズがルート(GCルート)からスキャンを開始するように設定され、各オブジェクトは、オブジェクトの実行可能な状態としてマークされ達し、クリーンアップフェーズはないがマークされません一掃するオブジェクト。

図が示すと:

ラージ・オブジェクトを割り当てる後者必要が利用可能でない連続したメモリをもたらす場合に欠陥が発生したメモリの断片を有する上記のように、Bが除去され、このアルゴリズムは、メモリ領域を残します。

整理するタグ

整理するタグにはないだろう内存碎片が完了した後、それはメモリを組織する問題が、また、ルートコレクション(GCルート)から不要なオブジェクトをマークし、クリアするためにスキャンを開始するために、パージ。

そのようなメモリは連続であるが、別の問題は、その中に生じる各移動物体を有し、従って高価。

レプリケーションのアルゴリズム

スタックがセット1Gはコピーアルゴリズムのスタックを使用する場合各512メートルで2つの領域に分割されること、である場合JVMは、コピーアルゴリズム二等分線にプッシュします。オブジェクト用のメモリを割り当てる場合は、必ずフル割り当てた後、GCはマークされ、その後、オブジェクトは空白領域を存続別に移動され、その後、生存しなかった任意のオブジェクトを削除し、そう繰り返し、配布するためにそれらのいずれかを使用このプロセスは、常に空白領域を使用するのが妥当ではありませんが存在します。

二つの領域は、互換的に使用される、最大の疑問は、今、ヒープメモリ使用量はわずか50%であり、スペースの無駄につながるされています。

概要

JVMコレクションアルゴリズムの概要:

  • クリアスピードを標識するが、それはメモリの断片化が生成されます。
  • タグ解決するために整理する明確にマークをコストが高いので、メモリの断片化の問題が、それぞれのオブジェクトを移動しなければなりませんでした。
  • ;アルゴリズムは、オブジェクトのメモリの断片化を移動する必要がありますが、スペースの無駄につながるものではないコピー

オブジェクトは、歳入ると?

新しく作成されたオブジェクトのうち、新世代の始まりに残りますが、JVMが実行していると、長いいくつか生き残ったオブジェクトは、古い時代にゆっくりと移動します。

よると対象年齢

JVMは、カウンターの対象年齢(年齢が)増加し、各オブジェクトはGC「を介して取得」、年齢が+1し、対象となることが、古い時代に移動するためにシフトします(デフォルトでは15歳)、設定されたしきい値に達しました-XX:MaxTenuringThresholdこのしきい値を調整します。

一度Minor GC、対象年齢は1になります、オブジェクトのしきい値が古い時代に移動され達し、他の生き残ったオブジェクトは、新しい世代のままになります。

ダイナミック年齢推定

また、対象年齢に基づいてポリシーも後にGCを入力するように15歳を待たずに、古い時代にオブジェクトを作るがある彼のおおまかなルールです、あなたは現在のオブジェクトの生存者を置く場合、オブジェクトの合計サイズがメモリサバイバーのこの数よりも大きいです50%は、そのオブジェクトは、オブジェクトの年齢層よりも大きい場合、あなたは直接、古い時代を入力することができます。

場合図、B、D、E上の4つのオブジェクト、Survivor 2100メートルである場合、A + B + Dメモリのサイズは、50mを超え、Dは、それが旧Eのに移動され、今や10熟成されます。実際、この計算ロジックはこれです:和の年齢年齢1 + N 2 +対象年齢の複数超えるSurvivor面積の50%を、それが古い年に以上のn個のオブジェクトを年齢します。

直接歳に大きなオブジェクト

あなたが設定した場合は-XX:PretenureSizeThreshold、このパラメータを作成するオブジェクトは、このような古い時代に大規模なオブジェクトに直接バイトの大規模な配列、この時間を割り当てるように、このパラメータの値よりも大きい場合は、新しい世代は渡しません。

そうすることで、繰り返し行くにコピーするためにコピーするためにそれらを運ぶために持っていた、そして最終的に古い時代に、オブジェクトを前後のような大規模なコピーは、非常に時間がかかり、GCを脱出し、新しい世代に大きなオブジェクトを避けることができます。

保証スペース割り当ての戦略は何ですか?

JVMそれはマイナーGC、すべてのオブジェクトの総容量の新世代より大きいのかどうか、古い最大利用可能な連続スペースをチェックする仮想チャンスを発生し、そうであれば未満、表示する仮想機会あれば、マイナーGCは安全である前にHandlePromotionFailureは、項目の値を設定します保証は失敗を許可するかどうか。= trueにHandlePromotionFailureがあれば、それが継続する古い時代のオブジェクトの平均サイズに以前のプロモーションよりの古い最大利用可能な連続スペースが大きくなるかどうかを確認するために多くのマイナーGCを実施しようとする試みが、今回はマイナーGCよりは依然として危険である場合、;未満の場合またはHandlePromotionFailureは= falseに、[フルGCを実施します。

フルGCの削減を最適化するには?

JVMのフルGCそれを低減するように最適化されなければならないか、フロントダウンの問題のいくつかの概要、およびラインに適用され、?次のように、他の例として、標準的な4コアマシンで8G、システムが最初に予約されている4G、4Gが割り当てられます。

  • ヒープメモリ:3グラム
  • 新世代:1.5グラム
  • 新世代エデンエリア:1228メートル
  • 新世代サバイバー面積:153メートル
  • メソッドのエリア:256メートル
  • VMスタック:1メートル/スレッド

次のようにパラメータを設定します。

-Xms3072m
-Xmx3072m
-Xmn1536m
-Xss=1m
-XX:PermSize=256m
-XX:MaxPermSize=256m
-XX:HandlePromotionFailure
-XX:SurvivorRatio=8
复制代码

システムは、メモリの量が毎秒占有推定します

、1日8時間数に応じて、毎秒システムによって占められるメモリの量、周りに20ワットの日活億ショッピングシステムであれば、日々の注文量を推定するために、まず、毎秒おそらくそのサービスの注文をJVM最適化する前に500の要求、およびどのくらいのメモリ各要求は、あなたが毎秒過ごしたいどのくらいのメモリ概算、計算の下で占めているが存在します。

毎秒500件のリクエストを想定、各要求は100K領域割当てを必要とし、それは、約1秒のメモリ50メートルを割り当てる必要があります。

計算の下で長いマイナーGCをトリガーする方法

以前の推定によれば、約50m割り当てられる1秒のメモリニーズは、空間エデン領域はマイナーGCを実行する平均25秒ごとに1228メートルです。

サバイバーかどうかを調査中の十分な面積

上記のモデルによると、25秒ごとに、すべてのオブジェクトの実行中にマイナーGC、GCを実行するために必要であり、新世代の外に再利用することができず、GC 50メートルのターゲットは、毎秒約100メートルの実装の残りの間に回収されないことを毎回そのサバイバーは、JVMがあるエリアに入ることになるが、忘れてはいけない年齢を決定するための動的メカニズムので、明らかサバイバースペースビット小さなダウンし、新世代のセット2048メートルので、トリガーを避けるために、動的な判定年齢を

-Xms3072m
-Xmx3072m
-Xmn2048m
...
复制代码

直接歳に大きなオブジェクト

ラージオブジェクトは、一般的にまあまあの追加、ラージオブジェクトは、前後の新世代に複製されていないよう、1Mの歳の設定オブジェクトに直接言えば、一般的にオブジェクトの長期生存および使用されているPretenureSizeThreshold = 1メートルのパラメータを。

...
-XX:PretenureSizeThreshold=1m
...
复制代码

合理的な対象年齢のしきい値を設定します

場合は、自動的に基づいて、マイナーGCをトリガするために25秒の当社の評価によると、15歳とガベージコレクションの後に脱出するために推進し、デフォルト後のマイナーGC MaxTenuringThresholdパラメータのデフォルト値は、GC 15エスケープ、それは後の6分の問題であるべき、あなたがダウンして少しので、これらのオブジェクトは、古い時代に入る必要があることを、できるだけ早く、古い時代にとして、新生代避けるには、スペースのコストや廃棄物をコピーサバイバーの新世代のための十分なスペースが得られ、完全なGCをトリガすることができ、現在のビジネスシナリオと。

...
-XX:MaxTenuringThreshold=6
...
复制代码

おすすめ

転載: juejin.im/post/5dc9f9675188250c31674b71