<Insert Picture Here> 高速JVM Oracle JRockitの全貌 入門編
May 24, 2015
<Insert Picture Here>
高速JVM Oracle JRockitの全貌入門編
Copyright© 2011, Oracle. All rights reserved.2
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。
OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
Copyright© 2011, Oracle. All rights reserved.3
Agenda
Oracle JRockitとは
Oracle JRockitの内部動作について
Oracle JRockitの性能分析、障害解析機能について
Copyright© 2011, Oracle. All rights reserved.4
Oracle JRockitWebLogic Serverを構成する重要コンポーネント
• オラクルが提供しサポートする、Java SE完全準拠のServer JVM
x86/x64に最適化した業界最速のJVM(現在はSPARC版も提供)
安定性を保証するヒープメモリ管理
1998年 Ver.1リリースから12年の利用実績
GC処理の制御
突発的な処理遅延の防止
安定した挙動を実現
SPECjbb2005Last updated: Jun. 3 2010
9611262
Oracle
JRockitItanium/Linux
6972897
Oracle JRockit
Xeon X5570/Linux
5534233
Oracle
JRockitAMD Opteron
8384/Linux
5210501
IBM
J9 JVMPower/AIX
世界最高値
業界最速 安定性
レスポンスタイム(m
s)
100
150
200
250
300
100
150
200
250
300
Oracle JRockitReal time
通常JVM
Copyright© 2011, Oracle. All rights reserved.5
クライアントサイドでのJavaの利用とは異なった特徴と要求
• 特徴• マルチプロセッサマシンでの利用
• 長時間稼動
• 大きなメモリヒープサイズ
• Synchronizationの多用
• 動的なクラスローディングの多発
• 小さい単位の処理を多くのスレッドで並行実行
• ソケット通信やファイルI/Oの多用
• 要求• 高信頼性
• 可用性/管理性
• 拡張性
• 性能
JRockit の特長 - The Server Side Java VM -サーバサイドJavaの特徴と要求
Copyright© 2011, Oracle. All rights reserved.6
JRockit の特長 - The Server Side Java VM -Java VM処理の比重
TM
IO
R
CG
MM
CG
R
TMMM
クライアント サーバ
CG = Code Generation
MM = Memory Management
TM = Thread Management
I/O
R = Reflection
クライアントとは異なるサーバサイドの処理要求に特化したJava VMが必要
Copyright© 2011, Oracle. All rights reserved.7
Agenda
Oracle JRockitとは
Oracle JRockitの内部動作について
Oracle JRockitの性能分析、障害解析機能について
Copyright© 2011, Oracle. All rights reserved.8
そもそも、JVMとは?
Solaris WindowsLinuxHP-UX AIX
Any Hardware
JVM JVM JVM JVM JVM
バイトコード
Java
JVM(Java Virtual Machine)・・・Javaプログラムの実行環境-バイトコードを1行ずつ機械語(Native code)に変換し実行-各OSの機能を覆い隠す役割も担う
ハードウェア
OS
ランタイム
中間コード
ソースコード
コンパイル
配布・実行
Copyright© 2011, Oracle. All rights reserved.9
JRockit アーキテクチャ ~ネーティブコード生成~
Sun JVMの場合• バイトコードのままインタープリタで実行
• メソッドの実行回数を常時監視
• 実行回数が閾値(-XX:CompileThreshold)を超えたメソッドをコンパイルしてネーティブコードを生成
JRockitの場合① 各メソッドの初回実行時にバイトコードをJITコンパイルしてネーティブコードを生成
② バックグランドで動くサンプルスレッドが定期的にアプリケーション・スレッドの状態を監視し、頻繁に使用されているメソッドをリストアップ
③ まだ最適化されていないメソッドのうちで最も使用頻度が高いメソッドをより高速なネーティブコードへ最適化
bytecode
JITコンパイルnativecode
nativecode+
アプリスレッド監視
①
最適化
②③
bytecode
nativecode
メソッド実行
回数監視
①
コンパイル
②③
ネーティブ実行 ネーティブ実行
インタプリタ実行 ネーティブ実行
Copyright© 2011, Oracle. All rights reserved.10
コード最適化を示す例
最適化されたコードでは、クラス A を実行するたびにクラス B を実行する必要がない
Copyright© 2011, Oracle. All rights reserved.11
JRockit アーキテクチャ ~スレッドローカルエリア(TLA)~
• TLAが無いと ・・・ 各スレッドはオブジェクトをアロケートするたびにヒープのロックを得る必要があるので遅い
• TLAが有れば ・・・ 各スレッドの専用エリアにオブジェクトをアロケートできるので速い(もちろんアロケート済みオブジェクトは他スレッドからも利用可能)
Thread 1 Thread 2 Thread 3
Heap lock
a = new Object(); c = new Object();b = new Object();
Thread 1 Thread 2 Thread 3
a = new Object(); c = new Object();b = new Object();
TLA for
Thread 1
TLA for
Thread 2
TLA for
Thread 3TLA for
Thread 1
Heap lock
Copyright© 2011, Oracle. All rights reserved.12
JRockit アーキテクチャ ~メモリレイアウト~
Javaの「オブジェクト」はSun JVMでもJRockitでもヒープに置かれる
Javaの「クラス」はSun JVMではPermanent領域、 JRockitではNative領域に置かれる
JRockitではSun JVMにおけるSurvivor(From&To)に相当する領域は無く、NurseryがフルになるとOldにすぐに昇格する
よって、JRockitでは、初回GCで生き残ったオブジェクトは全て以降はFull GCのチェック対象になるが、Full GCが発生しても問題ないような様々な工夫がされている
JRockitでは高速化等を目的にSun JVMには無い様々な情報がNative領域に置かれる
OldNursery
OldEden Survivor
ToFrom
Xmn
Sun JVMの場合
Xmx/XmsXns
Xmx/Xms
-XX:PermSize
-XX:MaxPermSize
Native
Nativ
e
Perm
anent
JRockitの場合
ヒープ
ヒープ
0 1
0 1 32
1回でプロモーション
最大32回でプロモーション
New
Copyright© 2011, Oracle. All rights reserved.13
Parallel GCとConcurrent GC
Parallel Concurrent従来のGC
STOP-THE-World!!
STOP-THE-
World!!
従来のGCでは、GCを一つのスレッドで実行し、その間アプリケーションスレッドは停止(STOP-THE-WORLD)していました。そのためマルチCPUマシンでGCの間待機するCPUが存在しスループットが低下する原因となりました。これへの対策が、GCを複数スレッドで実行するパラレルGC、アプリケーションを止めずにGCを1スレッドで実行するコンカレントGCです
CPUに処理が割り当てられず性能が低下
ご参考
Copyright© 2011, Oracle. All rights reserved.14
JRockit ガーベッジ・コレクション① Parallel Garbage Collection (for New GC and Old
GC)
JVMは1CPUあたり1GCスレッドを並列に使用して一気にGCを行う。GCの間はアプリケーションスレッドは完全に止まるが、トータルでのアプリケーションのスループットは最も高くなる。
Java
application
threads
Garbage Collector
threads
Copyright© 2011, Oracle. All rights reserved.15
JRockit ガーベッジ・コレクション② Mostly Concurrent Garbage Collection (for Old GC)
1つのGC専用のスレッドがGC処理のほとんどのフェーズをアプリケーションと同時に行う。GC中のアプリケーションのスループットは落ちるものの、停止は避けられる。
Java
application
threads
Garbage Collector
thread
GCスレッドがヒープ内のオブジェクトの移動と削除を行うときのみ、短時間アプリケーションスレッドが止まる。
Copyright© 2011, Oracle. All rights reserved.16
JRockit アーキテクチャ ~ガーベッジ・コレクション~ガーベッジ・コレクション方式の指定方法
動的GC重視する指針のみを指定し、GCアルゴリズムについてはJRockitが内部で最適な組み合わせを動的に選択
重視する指針 指定方法
アプリケーションのスループット
(デフォルト)-XgcPrio:throughput
個々のGCポーズタイムの短縮
-XgcPrio:pausetime -XpauseTarget=<n>ms
アプリのレスポンスタイム(JRockit Real Timeでのみ利
用可能)
-XgcPrio:deterministic -XpauseTarget=<n>ms
Copyright© 2011, Oracle. All rights reserved.17
0
15
30
45
60
75
90
105
120
0 2000 4000 6000 8000 10000 12000 14000 16000 18000
JRockit Real Time
0
15
30
45
60
75
90
105
120
0 2000 4000 6000 8000 10000 12000 14000 16000 18000
低トランザクション時:GCによる一部タイムアウトが発生しうる
高トランザクション時: GCによる停止により、レスポンスタイムが劣化する
0
15
30
45
60
75
90
105
120
0 2000 4000 6000 8000 10000 12000 14000 16000 18000
従来のJavaでは困難だった予測可能なレスポンスを実現
従来のJava
JRockit Real Timeは、Deterministic GCにより、GC停止時間を抑制→ 安定したレスポンスを提供アプリケーションに手を入れる必要なし
JRockit Real Time
Copyright© 2011, Oracle. All rights reserved.18
Deterministic GC - JRockit Real Time
Mostly Concurrent GC をさらに改善1世代ヒープ(NurseryとOld間の参照や移動のコストを削減)個々のPauseTimeの制限付け(-XpauseTarget=XXms)
ただし、あくまで努力目標。アプリ特性とヒープ設定によっては守れないことも。
アプリスレッドを止めなければならないGCのフェーズをパラレル化オブジェクトの生成速度を随時観察し、GCのスケジュールを最適化
例) ヒープ全体を一度にGCするのではなく、複数回の短いGCに分割例) ヒープが一杯になる前に早めにGCを開始例)開始したGCが予定時間内に終わりそうにない場合に、
一旦GCを中止し、可能なら残作業を次回GCに繰り越し
Java
application
threads
Garbage Collector
threads
Copyright© 2011, Oracle. All rights reserved.19
JRockit動的GCアルゴリズム別性能比較
スループット
・
レスポンス
ポーズタイム
Deterministic GCポーズタイム優先GCスループット優先GC
Copyright© 2011, Oracle. All rights reserved.20
Agenda
Oracle JRockitとは
Oracle JRockitの内部動作について
Oracle JRockitの性能分析、障害解析機能について
Copyright© 2011, Oracle. All rights reserved.21
JRockit Mission ControlJRockit 専用のGUI ベースの運用監視ツール TCP/IP ベースのプロトコルでリモートのJRockitプロセスの運用監視が可能
監視されるJRockit側は以下のオプションでポートを開けるだけ(エージェント等のインストール不要)例: -Xmanagement:port=7091,ssl=false,authenticate=false
機能一覧 Management Console: CPU 使用率、ヒープ使用状況、スレッド使用状況、MBean監視
Memory Leak Detector: 迅速なメモリリーク検出、オブジェクトの参照関係の階層表示
JRockit Flight Recorder: GC 詳細情報、ホットパッケージ、ホットメソッド情報
Copyright© 2011, Oracle. All rights reserved.22
Management Console稼動中のJVMを監視するコックピット
• リソースの使用状況を把握して性能劣化の原因を探る• CPU使用状況、メモリ使用状況(JVM/Machine)をグラフ表示
• 任意のMBean情報の閲覧、更新、グラフ化、トリガ・アラートの設定
• スレッド情報(スタックトレース、CPUビジー、デッドロック有無)の確認
• メソッドプロファイリング
監視対象に与えるオーバーヘッドは軽微
Copyright© 2011, Oracle. All rights reserved.23
Memory Leak Detector動的なヒープ診断によるメモリリーク検出
• メモリリークの原因となるオブジェクトの特定• サンプル中のオブジェクト増加数、サイズ、インスタンス数、ヒープ中の割合
• 各オブジェクトを参照しているオブジェクトスタックを階層的に表示
• 統計情報の取得・監視によるオーバーヘッドは軽微• GCのマーク・フェーズを巧みに利用してヒープ上のクラス別メモリの統計情報を取得
旧来のヒープダンプ採取方式に比べて飛躍的に軽快
Copyright© 2011, Oracle. All rights reserved.24
Javaアプリケーションの性能問題の分析Management ConsoleによるJVM稼動状況の可視化
• 稼動状況をリアルタイムに可視化するJVMコックピット
任意のJVMプロファイルを選択して可視化
ダイヤル/グラフ形式でのスタイル表示
頻繁に参照するプロファイルを用途に合わせてダッシュボード化
Copyright© 2011, Oracle. All rights reserved.25
• メソッド/スレッドプロファイリングにより処理負荷傾向を検出
Javaアプリケーションの性能問題の分析Management Consoleによる稼動状況JVMの可視化
プロファイリング対象メソッドを任意に指定してメソッドあたりの処理占有時間を把握
スタックトレースから処理内容を把握
メソッドプロファイリングを開始してメソッド毎の実行時間を計測
各スレッドのCPU使用率やデッドロック検出によりスレッドのリソース利用状況を把握
Copyright© 2011, Oracle. All rights reserved.26
Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出
• 増加傾向の高いオブジェクトをメモリリークと推定
• 増え続けるオブジェクト= 解放よりも割り当ての方が多い
• 明示的にGCを実施してヒープ使用の増加傾向を正確に把握
傾向分析前に数回GCを実施
増加傾向の高いオブジェクトに注目
増加傾向の高いオブジェクトの関連状況を追跡
Copyright© 2011, Oracle. All rights reserved.27
Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出
• 参照関係のあるオブジェクトを追跡
• 参照数の多いオブジェクトのタイプを追跡してリーク箇所を追跡
• 参照関係を順次追跡して根本原因となるオブジェクトのタイプを絞り込み
リーク傾向のあるオブジェクトタイプの参照関係を展開
参照数の多い参照オブジェクトのタイプを追跡
さらに参照関係を展開し根本原因を絞り込む
Copyright© 2011, Oracle. All rights reserved.28
Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出
• オブジェクトのタイプからリークしているインスタンスを追跡
• インスタンスの追跡により割り当て箇所の特定が可能
増加傾向のあるオブジェクトを格納するオブジェクト・タイプを特定
リークしているインスタンスを追跡して割り当て箇所を特定
Copyright© 2011, Oracle. All rights reserved.29
Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出
• 増加傾向のあるオブジェクトのインスタンスを順次追跡
• 最終的に該当オブジェクトを保持するスレッドを特定可能
インスタンスの保持関係を追跡
増加傾向のあるオブジェクトを保持するスレッドを特定
Copyright© 2011, Oracle. All rights reserved.30
Javaアプリケーションの性能問題の分析Memory Leak Detectorによるメモリリーク検出
• 増加傾向のあるオブジェクトの格納元からトレース
• 増加傾向のあるオブジェクトを格納している箇所を特定
• メモリリークを引き起こしている箇所を正確に突き止める
増加傾向のあるオブジェクトを格納するインスタンスの割り当てを確認する
スタックトレースから該当オブジェクトの割り当てを行っているアプリケーション位置を把握
増加傾向のあるインスタンスを割り当てているトレース情報を追跡
Copyright© 2011, Oracle. All rights reserved.31
JRockit Flight Recorder障害対応を強力に支援するOracle JRockitの新機能
Java EE/ISVアプリ
Oracle WebLogicServer
OracleJRockit
メモリ利用率の増加傾向 メモリ内データの内訳と増加率JRockit Flight Recorder
自動記録常時記録"録りっぱなし"
自動ファイル出力
DB関連処理内訳とSQL毎の負荷リスト
記録されるデータ(例)
Javaスレッドの処理状況GUIツール
特徴③アプリ修正不要
特徴②情報消失の防止
特徴①画期的な低負荷技術
その他多数…
[これまでの障害対応の課題]
•ログでは足りない情報不足
•ダウンや再起動による情報消失
[JRockit Flight Recorderによる解決]
•詳細情報を常時記録
•自動ファイル出力機能
Copyright© 2011, Oracle. All rights reserved.32
Copyright© 2011, Oracle. All rights reserved.33
Copyright© 2011, Oracle. All rights reserved.34
Copyright© 2011, Oracle. All rights reserved.35
是非JRockitを使ってみてください!!
• 評価版ダウンロード
• JRockit R28.0(Flight Recorderを搭載したJRockit)
• http://www.oracle.com/technology/global/jp/software/products/jrockit/index.ht
ml
• WebLogic Server 10.3.3(JRockit R28.0を同梱したWebLogic Server)
• http://www.oracle.com/technology/global/jp/software/products/ias/htdocs/wls_
main.html
• 関連マニュアル
• Oracle JRockit Flight Recorder Runtime Guide
• http://download.oracle.com/docs/cd/E15289_01/doc.40/e15070/toc.htm
• Using WLDF with Oracle JRockit Flight Recorder
• http://download.oracle.com/docs/cd/E14571_01/web.1111/e13714/using_flig
htrecorder.htm
• JRockit -XX Command-Line Option
• http://download.oracle.com/docs/cd/E15289_01/doc.40/e15062/optionxx.htm
• JRMC Eclipse Update Site
• http://www.oracle.com/technology/software/products/jrockit/missioncontrol/updat
es/base/4.0.1/eclipse/
Copyright© 2011, Oracle. All rights reserved.36
http://www.oracle.co.jp/inq_pl/INQUIRY/quest?rid=28
Oracle Direct 検索
あなたにいちばん近いオラクル
Oracle Directまずはお問合せください
Web問い合わせフォーム フリーダイヤル
専用お問い合わせフォームにてご相談内容を承ります。
※フォームの入力には、Oracle Direct Seminar申込時と同じログインが必要となります。
※こちらから詳細確認のお電話を差し上げる場合がありますので、ご登録されている連絡先が最新のものになっているか、ご確認下さい。
0120-155-096
※月曜~金曜 9:00~12:00、13:00~18:00
(祝日および年末年始除く)
システムの検討・構築から運用まで、ITプロジェクト全般の相談窓口としてご支援いたします。
システム構成やライセンス/購入方法などお気軽にお問い合わせ下さい。
Copyright© 2011, Oracle. All rights reserved.37
Copyright© 2011, Oracle. All rights reserved.38
38