PR:この記事にはアフィリエイトリンクが含まれます。
Javaアプリが遅いとき、まずGCを替えたくなる場面はありますよね。けれど原因を見ないままの調整は遠回りです。応答時間とスループットを測り、JFRやGCログで遅延の出どころを探るのが、JVM性能チューニングの実務的な入り口です。
本や記事を読むときも測定と記録を起点に原因を特定し、変更後に再測定する流れを追えば、設定値の暗記で終わりません。
| 書籍 | 版・発行 | 主な焦点 |
|---|---|---|
Javaパフォーマンス | 日本語版・第1版、2015年4月、448頁 | Java 8、性能測定、JFR・JMC、GCとG1 |
Optimizing Cloud Native Java | 英語第2版、2024年10月、496頁 | JMH、JFR運用、複数GC、クラウド診断 |
JVM Performance Engineering | 英語第1版、2024年4月、400頁 | OpenJDK HotSpot、GC性能評価、Unified Logging |
計測は問いから
改善に着手する前に、何を速くしたいのかをはっきりさせます。APIならp95やp99の応答時間、バッチなら処理件数や完了時間が目安。平均値だけでは少数の遅いリクエストを見落とします。
負荷の形やデータ量、同時実行数とJDKの版も記録してください。条件がそろわないと、設定変更の効果とアクセス傾向の違いを見分けにくくなります。
短いコード片の速度を見るJMHと、実アプリケーションの負荷試験は役割が異なります。JMHではウォームアップや測定回数を設け、JITコンパイルの影響によるばらつきを抑えるのが基本です。
本番の遅さはCPUやネットワークのほか、ロックやメモリ割り当て、外部サービスも関わります。マイクロベンチマークの数値をサービス全体の改善幅としてそのまま扱えません。
JFRで原因を絞る
JFR(JDK Flight Recorder)は、JVMやアプリケーションのイベントを記録する機能です。記録をJMC(JDK Mission Control)で調べると、CPUサンプルや割り当て、スレッド待ちに加えGCの動きも時間軸で追えます。
JFRで遅延した時刻を開き、CPUを使う処理やGC停止が重なったか確かめます。GC停止は一度なら短くても、頻発すれば応答時間が延びます。スレッド待ちが長い場合は、ヒープ調整以外の原因も調査しましょう。
JDK 11以降なら、たとえば jcmd <pid> JFR.start name=check settings=profile duration=5m filename=run.jfr のように記録を始められます。JDK 8では配布元や更新版によって条件が異なるため、実環境の対応状況を先に確認してください。
JFRの負荷とファイルサイズはイベント設定や記録時間によって変わります。負荷試験で計測の影響を確かめましょう。調査に必要な範囲を選べば、ファイルも扱いやすくなります。
GCログを読み解く
GCを調べるなら、停止時間だけで判断しないこと。発生頻度と回収前後のヒープ量も見ましょう。停止が短くても頻発すれば遅延につながり、回収後の使用量が減らないなら生存オブジェクトが多い可能性があります。
JDK 9以降では、-Xlog:gc*,safepoint:file=gc.log:time,uptime,level,tags がログ採取の一例です。Java 8では -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log など世代に合った指定を使います。
ログで割り当て速度が高いと分かったら、JFRで短命オブジェクトの生成元を探します。ヒープを広げるだけでは、割り当ての多い処理に伴うCPU負荷やGC回数を根本から減らせない場合があります。
G1、ZGC、Shenandoahはそれぞれ特性が異なります。停止時間に加えスループットやCPUの余力、ヒープの使い方をワークロードに合わせて評価してください。JDKやディストリビューションの対応状況も確認が必要です。
改善を再現する
変更は一度に一つへ絞りましょう。同じ負荷で測って前後の数値を記録すれば、改善の有無を比べられます。ヒープサイズとGC方式を同時に変えると、どちらの変更が改善につながったのか分からず、障害対応に役立つ知見も残りません。
短時間の測定だけで結論を急がず、ウォームアップ後の挙動や一定時間が過ぎた後の状態も見ましょう。キャッシュが温まる前後や長時間稼働した後に、挙動の差が出るアプリケーションもあります。
JDKの版や起動オプション、テスト条件とJFR記録、GCログを結果と合わせて保存しましょう。条件と数字がそろえば、リリース後の再現やロールバック判断にも使えます。
日本語版で基礎を学ぶ
『Javaパフォーマンス』はScott Oaks著、オライリー・ジャパン刊の日本語版です。Java 8に対応し、実アプリケーションの測定に加えてマイクロ・マクロ・メゾベンチマークを扱います。
スループットと応答時間の測定が入り口です。JFRの概要や有効化、イベント選択を収録し、JMCも扱います。GCの基礎とアルゴリズムを押さえたうえで、G1を含むチューニングへ進みます。性能調査の全体像を日本語で学べる内容です。
2015年刊でJava 8対応のため、現行JDKの運用手順や新しいGCの細部を学ぶ目的には情報が足りません。希望小売価格は税込4,290円で、実売価格は時期や販売店によって変わります。Java 8世代の測定とGCの考え方を日本語で学びたい人には、この本を勧めます。
クラウド運用へ広げる
『Optimizing Cloud Native Java, 2nd Edition』は2024年刊の英語書籍で、496ページです。中級から上級のJava技術者を対象に、レイテンシやスループットを含む性能試験を扱います。
JMHによるマイクロベンチマークに加え、JFRとJMC、運用時のJFRプロファイリングも扱います。クラウド環境のデプロイやオブザーバビリティ、アプリケーション診断へ性能測定をつなげて学べます。
G1やShenandoah、ZGCとGC性能に関する項目を、クラウド運用の内容と併せて収録しています。新しいJava環境の診断まで学びたい中級以上の技術者に適した内容です。英語で読む必要があります。
HotSpot内部を追う
『JVM Performance Engineering: Inside OpenJDK and the HotSpot Java Virtual Machine』はMonica Beckwith著の英語書籍で、2024年4月刊、400ページです。対象は経験のあるJava開発者や性能エンジニアです。
JMHのマイクロベンチマークと性能工学の方法論を軸に、GCとメモリ管理、G1・ZGCの性能評価を扱います。複数のワークロードでGC性能を評価する内容で、単一のベンチマーク結果に頼らない視点も身につく一冊です。
Unified JVM Loggingや診断手法に加え、性能最適化のケーススタディも収録されています。希望小売価格は49.99米ドルです。実売価格は販売時期や店によって変わります。JVM内部の挙動まで調べたい読者には本書を勧めます。
実務の診断例
APIのp99が悪化した場合は、まず負荷条件と時間帯をそろえます。JFRでCPUや割り当て、スレッド待ちを確かめ、同じ時刻のGCログと重ねれば停止時間と処理遅延の関係を追えます。
バッチの処理量が落ちたら、スループットやCPU使用率に加えてGC後のヒープ量を見ます。CPU飽和、割り当て増加、生存データの増加のどれが起きたかを確認します。症状ごとに対策を変えましょう。
測定とJFR、GCログを一続きに読むと、設定変更の根拠を説明しやすくなります。本の内容を現行JDKに当てはめるなら、対象バージョンと実測結果をそろえてください。
結論
日本語で性能測定とGCの基礎をつかむなら、『Javaパフォーマンス』がおすすめです。Java 8世代の内容を出発点にし、現行JDKのJFRや起動方法は利用環境に合わせて確認してください。
クラウド運用に加えてJFRやJMH、複数のGCを学ぶなら、『Optimizing Cloud Native Java, 2nd Edition』をすすめます。OpenJDK HotSpotの内部やGC評価手法を詳しく学びたい人には、『JVM Performance Engineering』をすすめます。
どの本でも読んだ設定値をそのまま本番へ入れず、同じ条件の負荷試験とJFR・GCログで効果を確かめるのが基本です。業務課題に合う一冊から読み始め、測定から改善結果の再現まで身につけてください。
Amazon の PC をスコア化してみた
Amazonにある8〜14インチの小型WindowsタブレットやノートPCを、スペック別にスコア化して比較・ランキング。




