JVM パフォーマンスの最適化は難しいと聞きました。今日試してみました!

JVM パフォーマンスの最適化は難しいと聞きました。今日試してみました!

[[403396]]

Java 開発を行う学生にとって、JVM パフォーマンス最適化は習得するのが比較的難しい知識ポイントと言えます。これは、JVM パフォーマンスの最適化には難解な JVM の知識を習得する必要があるだけでなく、JVM パフォーマンスの最適化をシナリオで使用するのが難しいためでもあります。

このため、多くの人が JVM パフォーマンスの最適化に馴染みがなく、空中に浮かぶ手の届かない城のように感じています。最近、仕事で JVM パフォーマンスの最適化をいくつか行いました。これは JVM チューニングの初心者にとって非常に役立つと思います。

背景

JVM が新世代と旧世代に分かれていることは周知の事実であり、アプリケーションの起動時に、アプリケーションを実行する JVM のメモリ サイズを調整するために、対応するパラメータを構成します。しかし、多くの場合、私たちは単に数字を大まかに見積もって、何気なく入力し、オンラインで調べていることを誰もが知っています。

筆者の会社もこのような状況です。 JVM のメモリ サイズは通常、かなり大きく設定されます。結局、メモリオーバーフローよりもメモリが多い方が良いので、多くのメモリの無駄が発生します。したがって、著者が受けたタスクは、すべてのアプリケーションをチェックし、適切なメモリ パラメータを調整し、JVM パフォーマンスを最適化することでした。

実践的なチューニング

アプリケーションの JVM パフォーマンスを調整するには、まずその実行方法を知る必要があります。これはちょうど病院に行って医者に診てもらうようなものです。薬を処方する前に、医師は患者を観察し、匂いを嗅ぎ、質問し、触診する必要があります。 Java では、JDK が提供するさまざまなコマンドなど、JVM の内部状況を観察する方法が多数あります。筆者の会社では監視に Prometheus を使用しているため、アプリケーションの JVM 実行状態を Prometheus 上で直接確認できます。

Prometheus パネルには、JVM に関連する主なコンテンツが 4 つあります: JVM Misc、JVM メモリ プール (ヒープ)、JVM メモリ プール (非ヒープ)、およびガベージ コレクションです。今回私たちにとってより関連性が高いのは、JVM メモリ プール (ヒープ) とガベージ コレクションです。

JVM メモリ プール (ヒープ) には、主に新世代の Survivor 領域、Eden Space 領域、旧世代を含む JVM ヒープ メモリの使用状況が表示されます。

JVM メモリ プール (ヒープ)

ガベージ コレクションでは、ガベージ コレクションの頻度 (ops は 1 秒あたりのガベージ コレクションの回数を示し、0.5 が通常適切な値です)、各 GC 一時停止の期間 (通常 80 ミリ秒以下が適切な値です)、新しい世代に割り当てられたメモリ/古い世代に昇格されたメモリなど、JVM のガベージ コレクションの状態が表示されます。

ガベージコレクション

JVM のパフォーマンスを最適化したい場合、最も簡単な方法は、ガベージ コレクションの GC 頻度と一時停止時間を観察して、アプリケーションのメモリ利用効率を大まかに判断することです。次に、これら 2 つの値の実際の状況に応じて、それらを適切な範囲に調整し、JVM の使用率を向上させます。

アプリケーションの GC 頻度が 0.02、つまり 1 秒あたり 0.02 GC しかない場合、1 回の GC に 50 秒かかるため、その GC 頻度は非常に低くなります。このとき、より大きな新世代のスペースが割り当てられる可能性があり、GC が必要になるまでに長い時間がかかります。このとき、一時停止時間に注目します。一時停止時間も短い場合は、アプリケーションのメモリを最適化する余地があると判断できます。

この場合、新しい世代に割り当てられるスペースは通常削減されます。新しい世代のスペースが小さくなると、割り当てにかかる時間が短縮されます。スペースが割り当てられると、GC 操作が開始されます。その結果、GC の数が増加し、アプリケーションのメモリ使用率が向上します。

メモリ空間を調整する場合、急激なメモリ変動による問題を回避するために、通常は小さなステップで調整を行います。まずは少しだけ調整してみて、大きな問題がなければ目標値に調整してください。結局のところ、これは本番環境です。何か問題が起きたら逃げなければならなくなるので、用心した方が良いです!

これを見ると、誰もが何をすべきか分かるはずだと私は信じています。次のステップは、JVM メモリ空間の 3 つのパラメータ (-Xmx -Xms -Xmn) を調整して、GC 頻度と GC 一時停止時間を適切な範囲内に保つことです。

アプリケーションレベルの最適化

GC 頻度と GC 一時停止時間に加えて、アプリケーションの種類に基づいて JVM メモリ消費量を分析することもできます。

例えば、インターフェース型のシステムの場合、多くのリクエストは 1 秒以内に完了します。このタイプのリクエストの場合、アプリケーションに入るときにメモリが割り当てられ、終了するとメモリがすぐに再利用されるため、残るオブジェクトはごくわずかです。このタイプのアプリケーションの JVM メモリ状況は、おおよそ次のようになります。新しい世代は大量のメモリを消費し、定期的にメモリを再利用しますが、古い世代はメモリをあまり消費しません。

長時間に渡るアプリケーション処理など、継続的な処理が必要なアプリケーション向け。生存時間が長いため、より多くのオブジェクトが古い世代に昇格される可能性があり、古い世代のメモリ消費量は比較的大きくなります。

JVM の新しい世代と古い世代のメモリ消費量を観察することで、アプリケーション自体の特性と組み合わせて、アプリケーション内の不合理な領域を見つけ、ターゲットを絞ってアプリケーションを最適化できます。たとえば、大量の一時データが毎回アプリケーション内のどこかのコンテンツに保存され、JVM が GC に突入してアプリケーションの遅延が発生する可能性があります。

要約する

この記事のチューニング方法を要約すると、GC の頻度と一時停止時間を観察して、JVM のメモリ領域を調整し、最も適切な状態を実現します。オンライン サービスに影響を与える可能性のあるメモリの急激な変動を回避するために、調整プロセス中に小さなステップを踏むことを忘れないでください。これは実際には JVM パフォーマンスを調整する最も簡単な方法であり、大まかな調整と見なすことができます。しかし、JVM パフォーマンス チューニングにはより詳細なパラメーターが存在するため、機会があれば後ほどそれらについて説明します。

さらに、JVM の新しい世代と古い世代を観察することで、アプリケーションをターゲットに最適化し、アプリケーション自体のパフォーマンスを向上させることもできます。

これまでに JVM の基本的な理論的知識を学習したことがない場合、この記事を理解できない可能性があります。次に、私の「JVM 基礎入門シリーズ」を読むことをお勧めします。記事は最も単純なものから最も複雑なものまで段階的に説明されており、JVM を感覚的に理解することができます。この記事を読んだら、きっと啓発された気分になるでしょう!

JVM 基礎入門シリーズ ポータル: JVM 基礎入門シリーズ

JVM パフォーマンス チューニングについては以上です。

この記事はWeChatの公式アカウント「陳淑宜」から転載したもので、以下のQRコードからフォローできます。この記事を転載する場合は、陳淑易の公式アカウントまでご連絡ください。

<<:  Flux+Flagger+Istio+Kubernetes を使用して GitOps クラウドネイティブ プログレッシブ (カナリア) 配信を実装する

>>:  [Sticky JVM] JVM チューニングとは何ですか?

推薦する

ガートナー:ハイブリッドクラウドは主流のアプリケーショントレンドに

世界的な流行と経済減速の影響を受け、中国企業はデジタルビジネス変革を支援するためにクラウド移行のペー...

第4回中国ICユニコーンリストが発表

近年、国内の集積回路分野は、需要と供給がともに好調な状況が続いています。一方、市場におけるチップの需...

Redis 分散ロックの原理がまだわかりませんか?早く学んでみませんか?

[[321595]]学校で小さなプロジェクトに取り組んでいたとき、Redis を使用していましたが、...

権威ある百度製品を活用してキーワードランキングを向上させる方法

良いウェブサイトランキングは、高品質の外部リンクの構築と切り離せないことは誰もが知っていると思います...

edis-ロシアのデータセンターKVM、最初の1か月は無料、1000Mポート

edis.at は長年の歴史があり、VPS、サーバーなどには多数の異なるデータセンターがあり、ほぼさ...

2018年がハイブリッドクラウドの年となる理由

調査によると、IT およびビジネスの意思決定者の 85% が、パブリック クラウド、プライベート ク...

Docker(パート3):Dockerfileコマンドの詳しい説明

前回の記事「Docker (II): Dockerfile の使い方入門」では、Dockerfile...

Hosteons VPSはどうですか? Dallas AMD Ryzen+NVMe シリーズのレビュー

ホストオンはどうですか?ホストは良いですか? Hosteons の AMD Ryzen+NVMe に...

テンセントクラウドが新しい星星海サーバーをリリース、従来製品のアプリケーション規模は前年比30倍に増加

3月16日、Tencent Cloudは自社開発の新世代星星海サーバーのリリースを発表した。サーバー...

一般的なキーワードのピアウェブサイトが公式サイトに追加された場合の対処方法

百度は偽のいわゆる公式サイトを取り締まるため、高度なザクロアルゴリズムを使用して特定のウェブサイトを...

インターネットマーケティングは効果がなく、お金も稼げません。空虚すぎませんか?

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

WeChat販売のウォームアップと成熟

著者には、わずか半年でWeChatプラットフォームを利用して古い顧客グループを集めたNikoという友...

hosteons - 30% 割引コード/無制限トラフィック VPS/KVM 仮想化/Windows|Alipay

こちらは、hosteons の VPS の 30% 割引コードです (年間支払いの場合のみ)。また、...

小馬世徒馬山:どうすれば良い検索広報ができるか?

最近、著者は「オンラインPR:検索PRとは何か」と「検索PRの価値と意義」という2つの記事を通じて、...

まず検索エンジンを考慮し、次にユーザーエクスペリエンスを考慮する

この期間中、Baidu の最近のアルゴリズム調整の影響を受けたいくつかの電子商取引 Web サイトで...