Meituan インタビュー: JVM チューニング パラメータについてどのような知識をお持ちですか?幸い、準備はしておきました!

Meituan インタビュー: JVM チューニング パラメータについてどのような知識をお持ちですか?幸い、準備はしておきました!

[[419665]]

正直に言うと、3~5 年間 Java 開発を行っていても、JVM チューニング パラメータを使用したことがない人はたくさんいます。

ただし、面接官はあなたが以前にそれを使用したことがあるかどうかを気にしません。面接官が考えているのは、「この質問に答えられないということは、あなたが低学歴だという証拠だ。どうしてそんなに高い給料がほしいのか?ありえない」ということです。

早速、今日の乾物から始めましょう。

まず、この記事の主な内容を見てみましょう。

今日は、JVM チューニングでよく使用されるいくつかのパラメータについて詳しく見ていきましょう。

XまたはXXで始まるものは非標準パラメータです

つまり、標準化されたパラメータは変更されず、非標準化されたパラメータは各 JDK バージョンで変更される可能性があります。ただし、現時点では、X で始まる非標準化パラメータはほとんど変更されません。

  1. 形式: -XX:[+-]< name > は、名前属性を有効または無効にすることを意味します
  2. 例: -XX:+UseG1GC (G1 ガベージ コレクターを有効にすることを示します)

-XX:+PrintCommandLineFlags を使用すると、現在の JVM によって設定された関連パラメータを表示できます。

JVMパラメータ分類

パラメータ タイプは、JVM パラメータの先頭によって区別され、「-」、「-X」、「-XX」の 3 つのカテゴリに分けられます。

標準パラメータ (-): すべての JVM 実装はこれらのパラメータの機能を実装し、下位互換性を保つ必要があります。

例: -verbose:class、-verbose:gc、-verbose:jni...

非標準パラメータ (-X): デフォルトの JVM はこれらのパラメータの機能を実装しますが、すべての JVM 実装がそれらを満たすことは保証されておらず、下位互換性も保証されません。

例: -Xms20m、-Xmx20m、-Xmn20m、-Xss128k...

不安定なパラメータ (-XX): これらのパラメータは、JVM ごとに異なる方法で実装される可能性があり、将来いつでもキャンセルされる可能性があります。注意して使用する必要があります。

例: -XX:+PrintGCDetails、-XX:-UseParallelGC、-XX:+PrintGCTimeStamps……

ヒープパラメータ設定

-Xms 初期ヒープ サイズ、ms はメモリ開始の略語で、-XX:InitialHeapSize と同等です。 -Xmx 最大ヒープ サイズ、mx はメモリ最大数の略語で、-XX:MaxHeapSize パラメータと同等です。

注意: 通常の状況では、サーバー プロジェクトの実行中はヒープ スペースが縮小および拡大し続けるため、必然的にシステムに不要な負荷がかかります。

したがって、実稼働環境では、ヒープ サイズを調整するときに GC に不必要な負荷がかからないように、JVM の Xms と Xmx を同じサイズに設定する必要があります。

-XX:NewSize=n は若い世代のサイズを設定し、-XX:NewRatio=n は若い世代と古い世代の比率を設定します。

たとえば、-XX:NewRatio=3 は、若い世代と古い世代の比率が 1:3 であり、若い世代が若い世代と古い世代の合計の 1/4 を占めることを意味します。新しい世代と古い世代のデフォルトの比率は 1:2 です。 -XX:SurvivorRatio=n 若い世代の Eden 領域と 2 つの Survivor 領域の比率。

注意:サバイバーエリアは2つあり、デフォルトは8です。つまり、Eden:S0:S1=8:1:1です。

たとえば、-XX:SurvivorRatio=3 は、Eden:Survivor=3:2 を意味し、Survivor 領域は若い世代全体の 1/5 を占めます。

メタスペースパラメータ

-XX:MetaspaceSize: メタスペース空間の初期サイズ。設定されていない場合、デフォルトは 20.79M です。この初期サイズは、最初の Metaspace Full GC をトリガーするためのしきい値です。

例: -XX:MetaspaceSize=256M

-XX:MaxMetaspaceSize: メタスペースの最大値。デフォルトではサイズ制限はありませんが、オンライン環境では設定することをお勧めします。

例: -XX:MaxMetaspaceSize=256M

-XX:MinMetaspaceFreeRatio: 最小空き領域比率。 Metaspace で GC が発生すると、Metaspace の空き率が計算されます。空き比率 (空き領域 / 現在のメタスペース サイズ) がこの値より小さい場合、メタスペースの拡張がトリガーされます。デフォルト値は40(40%)です。例:-XX:MinMetaspaceFreeRatio=40

-XX:MaxMetaspaceFreeRatio: 最大空き率。 Metaspace で GC が発生すると、Metaspace の空き率が計算されます。空き比率 (空き領域 / 現在のメタスペース サイズ) がこの値より大きい場合、メタスペースが領域を解放するようにトリガーされます。デフォルト値は70(70%)です。例:-XX:MaxMetaspaceFreeRatio=70

頻繁な拡張を避けるために、MetaspaceSize と MaxMetaspaceSize を同じサイズに設定することをお勧めします。

スタックパラメータ設定

-Xss: スタックスペースのサイズ。スタックはスレッド専用なので、スレッドが使用するスタック スペースのサイズになります。

例: -Xss256K。このパラメータが設定されていない場合、デフォルト値は 1M です。一般的には、256K に設定すれば十分です。

コレクターパラメータ設定

シリアル ガベージ コレクター (新世代)

有効: -XX:+UseSerialGC 無効: -XX:-UseSerialGC //新しい世代は Serial を使用し、古い世代は SerialOld を使用します

ParNew ガベージコレクター (新世代)

-XX:+UseParNewGC を有効にする -XX:-UseParNewGC を無効にする //新しい世代は ParNew 関数を使用し、古い世代は CMS 関数を使用する

パラレル スカベンジ コレクター (新世代)

-XX:+UseParallelOldGC を有効にし、-XX:-UseParallelOldGC を無効にします //新しい世代では、Parallel Scavenge 関数が使用されます。古い世代は Parallel Old コレクターを使用します。

ParallelOl ガベージ コレクター (旧世代)

-XX:+UseParallelGC を有効にする -XX:-UseParallelGC を無効にする //新しい世代は Parallel Scavenge 関数を使用します。古い世代は Parallel Old コレクターを使用します。

CMS ガベージ コレクター (旧世代)

-XX:+UseConcMarkSweepGC を有効にする -XX:-UseConcMarkSweepGC を無効にする

G1 ガベージコレクター

-XX:+UseG1GC を有効にする -XX:-UseG1GC を無効にする

GC戦略パラメータ設定

GC 一時停止時間。ガベージコレクターは、若い世代を減らすなど、さまざまな手段でこの時間に到達しようとします

-XX:最大GC一時停止ミリ秒

マーキング サイクルをトリガーする Java ヒープ占有率しきい値は、GC をトリガーする占有ヒープの割合です。デフォルトの占有率はJavaヒープ全体の45%です。

-XX:ヒープ占有率の開始=n

新世代が対応できる最大のオブジェクト。この値より大きいオブジェクトは、古い世代に直接割り当てられます。 0 は制限なしを意味します。

-XX:事前登録サイズしきい値=1000000 //

古い世代に入るための GC の最小年齢。若い世代のオブジェクトを古い世代のオブジェクトに変換するための最小の年齢値。デフォルト値は7です

-XX:初期殿堂入りしきい値=7

旧世代の年齢をアップグレードします。最大値は15です。

-XX:最大テンリングしきい値

GC並列実行スレッドの数

-XX:並列GCスレッド=16

System.gc() を無効にします。このメソッドはデフォルトで FGC をトリガーし、パラメータ内の UseG1GC と UseConcMarkSweepGC を無視するため、必要に応じてこのメソッドを無効にすることができます。

-XX:-+明示的なGCを無効にする

スループットサイズを設定します。デフォルトは99です。

XX:GC時間比率

適応戦略をオンにすると、各領域の比率や古い世代への昇格年齢などのパラメータが自動的に調整されます。スループットと一時停止時間のバランスを実現します。

XX:アダプティブサイズポリシーを使用する

プログラムの実行時間を占めるGC時間の割合を設定します

GC時間比率

例外スナップショットをダンプする

-XX:+メモリ不足エラー時のヒープダンプ

-XX:ヒープダンプパス

ヒープ メモリ OOM の確率は、すべてのメモリ枯渇例外の中で最も高くなります。エラー発生時のヒープ情報は、問題の解決に非常に役立ちます。

したがって、JVM にこのパラメータ (-XX:+HeapDumpOnOutOfMemoryError) を設定して、OOM 例外が発生したときにヒープ情報を出力できるようにし、(-XX:+HeapDumpPath) パラメータを使用してヒープ メモリ オーバーフロー スナップショット出力のファイル アドレスを設定します。

これは、数か月間隔で発生する OOM 例外の場合に特に重要です。

  1. -Xms10M -Xmx10M -Xmn2M -XX:生存率=8 -XX:+メモリ不足エラー時のヒープダンプ
  2. -XX:HeapDumpPath=D:\study\log_hprof\gc.hprof

-XX:メモリ不足エラー

OOM が発生した後に jconsole.exe プログラムが実行されることを示します。

jconsole.exe のパス Program Files にはスペースが含まれているため、ここで "" を追加する必要はありません。このパラメータを使用すると、システム OOM 後のスクリプトをカスタマイズして、電子メール警告情報の送信やシステムの再起動などに使用できます。

  1. -XX:OnOutOfMemoryError= "C:\Program Files\Java\jdk1.8.0_151\bin\jconsole.exe"  

8Gメモリを搭載したサーバーの設定方法

  1. java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-Xmx3500m は、JVM の使用可能な最大メモリを 3550M に設定します。

-Xms3500m は JVM 初期メモリを 3550m に設定します。この値を -Xmx と同じに設定すると、各ガベージ コレクション後に JVM がメモリを再割り当てするのを防ぐことができます。 -Xmn2g は若い世代のサイズを 2G に設定します。

ヒープ全体のサイズ = 若い世代のサイズ + 古い世代のサイズ + メソッド領域のサイズ

-Xss128k は各スレッドのスタック サイズを設定します。

JDK1.5以降では、各スレッドのスタックサイズは1Mとなり、それ以前は、各スレッドのスタックサイズは256Kでした。アプリケーションのスレッド要件に基づいてメモリ サイズを調整します。同じ物理メモリの場合、この値を減らすと、より多くのスレッドが生成されます。ただし、オペレーティング システムではプロセス内のスレッド数に制限があり、スレッドを無限に生成することはできません。経験値は3000~5000程度です。

-XX:NewRatio=4 は、若い世代 (Eden と 2 つの Survivor 領域を含む) と古い世代 (永続的な世代を除く) の比率を設定します。 4 に設定すると、若い世代と古い世代の比率は 1:4 になり、若い世代がスタック全体の 1/5 を占めます。

-XX:SurvivorRatio=4 は、若い世代の Eden 領域と Survivor 領域のサイズ比を設定します。

4 に設定すると、2 つの Survivor 領域と 1 つの Eden 領域の比率は 2:4 になり、1 つの Survivor 領域が若い世代全体の 1/6 を占めます。 -XX:MaxPermSize=16m は、永続世代のサイズを 16m に設定します。

-XX:MaxTenuringThreshold=0 はガベージの最大年齢を設定します。

0 に設定すると、若い世代のオブジェクトは Survivor 領域を通過せず、古い世代に直接移動します。古い世代が多いアプリケーションでは、効率が向上します。この値をより大きな値に設定すると、若い世代のオブジェクトが Survivor 領域に複数回コピーされ、若い世代のオブジェクトの生存時間が長くなり、若い世代でリサイクルされる可能性が高くなります。

プロジェクト内のGCログ構成

たとえば、ユーザー サービス プロジェクトを開始します。

  1. ジャワ
  2. -XX:+PrintGCDetails -XX:+PrintGCDateStamps
  3. -XX:+GCログファイルのローテーションを使用する
  4. -XX:+PrintHeapAtGC -XX:GCログファイル数=5
  5. -XX:GCログファイルサイズ=20M
  6. -Xloggc:/opt/ユーザー-service-gc-%t.log
  7. -jarユーザー-service-1.0-SNAPSHOT.jar

パラメータの説明:

  1. -Xloggc:/opt/app/ard- user / user -service-gc-%t.log ログディレクトリとログ名を設定します
  2. -XX:+UseGCLogFileRotation はローリング生成ログをオンにします
  3. -XX:NumberOfGCLogFiles=5 ローリングGCログファイルの数。デフォルトは0で、ローリングはありません。
  4. -XX:GCLogFileSize=20M GCファイルのローテーションサイズ。UseGCLogFileRotationを有効にする必要があります。
  5. -XX:+PrintGCDetails は、GC ログの詳細 (GC タイプ、各操作に使用された時間を含む) の記録を有効にし、プログラム実行の最後に JVM のメモリ使用量を出力します。
  6. -XX:+ PrintGCDateStampsはシステムのGC時間を記録します
  7. -XX:+PrintGCCause は GC を発生させます (デフォルトで有効)

プロジェクトで使用していなかった場合はどうなりますか?

一度も使用したことのない多くの人は、面接官からプロジェクトでこれらのパラメータがどのように使用されるかを尋ねられたときに、妥協して「使用したことがない」と愚かに答えてしまうことがよくあります。

秘密を教えましょう。多くの面接官もこれを使ったことがありません。

さらに、自分で小さなプロジェクトを作成し、JVM パラメータを小さい値に設定し、テスト ツール JMeter を使用してマルチスレッド テストを実行することもできます。

コード内で次の質問を作成できます。

メモリリーク

メモリリーク

スタックオーバーフロー

次に、JVM パラメータを使用してチューニングするか、JVM ツールと関連コマンドを使用して問題を見つけ、問題を解決します。

<<:  クラウドデータベースの選択では「CAP定理」は避けられない?

>>:  DPU: 5Gエッジクラウドの新たな基盤

推薦する

Splunkは、Amazon Web Services Security Hubとの新たな統合を発表し、検出、調査、対応を加速し、さらなる支援を提供します。

データをアクションと価値に変えることに専念する Splunk, Inc. は本日、新しい Amazo...

ウェブサイトの外部リンク公開とターゲットプロモーション

多くの初心者ウェブマスターが外部リンク獲得に苦労していると思います。A5 Webmaster Net...

hostkvm: 米国 VPS、3 ネットワーク必須 CU-VIP 回線、月額 5 ドル、1G メモリ/1 コア/15g SSD/500g トラフィック

Hostkvmは今年3月にロサンゼルスで新しいVPSサービスを開始し、3つのネットワークに中国聯通の...

BATはいずれもクラウドサービスをアップグレードし、クラウド戦争は始まったばかりだ

2018年上半期、百度は新たな一連の技術システムアーキテクチャ調整を発表し、その中でABCインテリジ...

Digitalocean、Vultr、LinodeはいずれもAMDシリーズの高性能クラウドサーバーを導入している。

現在、国際的なクラウドサーバー市場はすでに形成されており、中低価格帯のクラウドサーバー市場における3...

地域社会が悪質な登録を防ぐ方法

実際、左志明は最近、地域コミュニティの運営を研究しており、主要な地域ポータルコミュニティのウェブサイ...

オンライン実名制がSEO業界に与える影響

国務院:インターネット実名制は来年6月末までに実施されます! 一部の人々は依然として主要なフォーラム...

探索は喜びと不安をもたらす

Google の「ロボット」がインターネットの隅々までクロールして以来、検索エンジンは人々にとって欠...

#ダブルチャージ:ImpactVPS-256mメモリVPS年間支払い6ドル、シアトル10Gポート

ImpactVPS のクリスマス プロモーションは今から始まります。クリスマスは過ぎましたが、VPS...

従来の企業思考が変わらない限り、インターネット人材を見つけるのは困難です。信じられないなら、試してみてください。

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています多くの伝統...

softshellweb: 年末プロモーション、台湾 VPS/米国 VPS/オランダ VPS、1Gbps 帯域幅、年間 34.99 ドルから

Softshellweb は年末プロモーションを開始しました。台湾 VPS、米国 VPS (カリフォ...

入札ページとは何ですか? 入札ページに何を反映させるべきですか?

多くの友人は、入札単ページについて聞いたことがあるはずです。さらに、医療業界であろうとタオバオであろ...

なぜ多くの人がウェブサイト構築に MiTo テンプレートを選択するのでしょうか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています2018 ...

バイトダンスはMCNを信じていない

ますます白熱する世論の場において、李自奇と杭州衛年との対立は、才能ある馬とその主人の物語から、資本が...

ソフトライティングスキルを学ぶためのA5サイズの提出ガイド

Baidu のアルゴリズムは日々変化しており、高品質の外部リンクを公開することは歴史的な問題となって...