書籍「Javaパフォーマンス」を読んで

監訳者の@cero-tさんから頂きました。@cero-tさん、ありがとうございます。

Javaパフォーマンス

Javaパフォーマンス

Javaトラブルシューティングに関する仕事に関わっていると、まだ切り分けができていない性能遅延の原因について、GCが疑われることが良くあります。『自動で動く』ことによるブラックボックス感によりGCは疑われやすくなっていると思います。

しかし、実際に色々な案件の解析を繰り返すと、性能遅延の要因は多種多様です。過去に遭遇した代表的なものには、GC以外にも以下のような遅延要因があります。

  • アプリケーションの不効率なロジック (ループ過多、オブジェクト生成過多)
  • 過度なロック、同期漏れ/volatile漏れから無限ループ発生によるCPU消費
  • ローカルJVM内でリモートEJBを呼び出すことによるシリアライズ遅延
  • JDBC executeBatch()未使用でのバルク更新
  • JPAのフェッチ設定誤り(N+1問題)による大量SQL発行
  • 初期化コストの高いFactoryの多重初期化 (EntityManagerFactory, パーサのFactory)

本書 Javaパフォーマンス のスコープは非常に広く、上記のようなJVMJava SE APIJava EEの広い範囲の性能課題について触れています。本書のような内容が日本語では今までなかったため、トラブル時にはJava SeriesのJava Performanceで苦戦しながら調べていましたが、本書も机の上に置いておこうと思います。

以下、個人的に嬉しかった部分をまとめます。

JITに関する言及が嬉しい

JITがどのようなコードをコンパイル対象としていて、どのようなタイミングでコンパイルされるのか、各種閾値やOn Stack Replacement、エスケープ分析について書籍で見かけたことがなかったため、仕組みを理解する上で役立ちました。
トラブルが起こると『どういう仕組みで問題が起こったのか』の説明が必要となるケースがよくあります。コードキャッシュの溢れが起こった場合に『そもそもJITって?』の説明を求められた場合に参考にしようと思います。

具体的なGCログが嬉しい

CMS-GCのpromotion failedやconcurrent mode failure、G1GCのto-space overflowやFullGCの発生など、何らかのチューニングを行った方が良い状況を示すGCログが具体的に示されているため、トラブル時にすぐに使える内容になっています。

新しい解析ツールの解説が嬉しい

HotSpotとJRockitの統合に伴い、Java7以降に様々なツールがOracleJDKに付属されるようになっています。jcmd、Java FlightRecorder、Native Memory Trackingについて本書では解説されており、FlightRecorderについてはセットアップ方法だけでなく、収集対象イベントの調整や、JavaヒープのEdenへの割り当てを高速化させるTLAB(thread local allocation buffer)が十分かの考察方法にまで踏み込んで記載しています。

まとめ

Javaパフォーマンス、以下のような方におすすめです。

  • Java性能問題が起こるポイントを網羅的に把握したい方
  • JDK付属の各種解析ツールのリファレンスとして
  • JITGCの仕組み、volatile、SoftReference/WeekReferenceなどの一歩踏み込んだJavaを知りたい方