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エッジクラウドの新たな基盤

推薦する

マルチクラウド インフラストラクチャ監視において自動化が重要な要素となる理由

今日、企業にとって、サービスと顧客満足度を維持するために、インフラストラクチャがスムーズに稼働してい...

#BlackFriday# 契約: 月額 30 元、KVM/8G メモリ/4 コア/300G ハードディスク/無制限トラフィック、古いドイツのデータセンター

ドイツの老舗データセンターであるコンタボのブラックフライデープロモーションはかなり特別です。コンタボ...

オンライン編集者の生存に関する調査:平均月収4,000元の600万人の実践者

ウェブ編集者は特別な職業であり、特別なグループでもあります。関連の推計によると、現在、全国でウェブ編...

Canalys:中国のクラウドサービス支出は2021年第1四半期に60億ドルに達した

市場調査会社Canalysが発表した最新データによると、中国のクラウドインフラサービス支出は2021...

インターネットマーケティングは中国の声から学べる

実は、最初はそんなバラエティ番組があることを知りませんでした。後になって、周りの人が「中国の声」につ...

検索エンジンの基本構造は何ですか?検索エンジンのアーキテクチャを設計する理由は何ですか?

月給5,000~50,000のこれらのプロジェクトはあなたの将来です優れた SEO 担当者としては、...

ガートナー マジック クアドラント: AWS は引き続き IaaS 市場をリード

ガートナー社の年次マジック・クアドラント・レポートによると、AWS は引き続き主要な IaaS パブ...

オンライン音楽の料金が迫る:北京著作権局が音楽著作権保護を強化

北京ニュース(記者 杜丁)昨日、北京著作権局から、書画作品の著作権侵害が横行していることを受け、北京...

エッジコンピューティングがデジタルエコシステムを変える6つの方法

過去 2 年間を振り返ると、デジタル インフラストラクチャは私たちの生活、学習、仕事のほぼすべての側...

hostodo: 年間 25 ドル、米国 VPS (データセンター 3 か所)、2G メモリ/2 コア/20GNVMe/5T トラフィック

Hostodo (~) は現在、ラスベガス、スポケーン、マイアミのデータセンターで、少なくとも 5T...

Inspur CloudのLi Mingyu氏:クラウドデータ統合は、従来のIT変革のための統合ソリューションを提供します

11月25日、国内データベース業界の有名企業であるDAMOは北京で「抜刀、智能の未来」2020年DA...

ライブエンターテイメント業界への洞察

以来、エンターテインメントライブストリーミング業界は新たな段階に入りました。一方、主要なエンターテイ...

百度のグループ購入事業はO2Oレイアウトの準備のために開始されました

Webmaster Network (www.admin5.com/) は 2 月 27 日に次のよ...

INIZ - 年間 14 ドル / メモリ 256 MB / ハードディスク 20 GB / トラフィック 500 GB / ニューヨーク / ロサンゼルス

INIZは中国人を嫌っています。私は1年以上アカウントを持っていましたが、結局削除されました。でも、...

専用com: 月額 54 ドル、米国専用サーバー (ロサンゼルスを含む 9 つのデータセンター)、E3-1270v5/v6/64G メモリ/2*512GSSD/100T トラフィック/5IPv4

Dedicated.com は、米国の老舗サーバープロバイダーです。主に低価格の独立サーバー事業を運...