22
<Insert Picture Here> JRockit 解析ツールの紹介 日本オラクル(株) カスタマーサービス統括本部 テクニカルアナリスト 横澤 2009年4月14日

JRockit 解析ツールの紹介

Embed Size (px)

DESCRIPTION

第一回 WebLogic Server 勉強会資料

Citation preview

<Insert Picture Here>

JRockit 解析ツールの紹介

日本オラクル(株) カスタマーサービス統括本部テクニカルアナリスト 横澤 潤2009年4月14日

Copyright© 2009, Oracle. All rights reserved. 2

以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメント(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さい。オラクル製品に関して記載されている機能の開発、リリースおよび時期については、弊社の裁量により決定されます。

Oracle、PeopleSoft、JD Edwards、及びSiebelは、米国オラクル・コーポレーション及びその子会社、関連会社の登録商標です。その他の名称はそれぞれの会社の商標の可能性があります。

Copyright© 2009, Oracle. All rights reserved. 3

Agenda

• JRockit とは?

• JRockit Ctrl-Break ハンドラの活用• Ctrl-Break ハンドラの使い方と、Javaヒープ内のメモリリークオブジェクトの特定方法について紹介します。

• JRockit Mission Control 概要• JRockit Mission Control と、Javaヒープ内のメモリリークオブジェクトの特定方法について紹介します。

Copyright© 2009, Oracle. All rights reserved. 4

JRockit とは?

Copyright© 2009, Oracle. All rights reserved. 5

JRockit とは?• 概要

• Oracleが提供&サポートするJava SE完全準拠のJVM• サーバサイド用途専用に設計された高信頼性のJVM

※現在はクライアントサイド用途にも対応

• Intelアーキテクチャ(Xeon、Itanium 2)へ最適化された業界最速のJVM※現在はSPARC版も提供

• 歴史• 1998 年 スウェーデン アピールバーチャルマシンより初版がリリース• 2002 年 BEA が アピールバーチャルマシンを買収• 2008 年 Oracle が BEAを買収

• Sun Java SE との互換性• java –version でベースとなる Sun Java SE のバージョンを表示

• JRockitに含まれる各種ツール、JavaAPIは基本的にJava SEと同一だが、Java SEでは定義されていない部分(ネーティブコード生成・最適化、メモリ管理、独自ツール等)を固有実装

• 運用監視機能・デバッグツール• 運用・監視・デバッグ・開発に有用な各種独自ツールの提供

java version "1.5.0_14"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03)

BEA JRockit(R) (build R27.5.0-110-94909-1.5.0_14-20080204-1558-windows-ia32, compiled mode)

java version "1.5.0_15"

Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_15-b04)

BEA JRockit(R) (build R27.6.0-47_o-99698-1.5.0_15-20080603-2103-windows-ia32, compiled mode)

R27.5

R27.6

Copyright© 2009, Oracle. All rights reserved. 6

JRockit Ctrl-Break ハンドラの活用

Copyright© 2009, Oracle. All rights reserved. 7

Ctrl-Break ハンドラとは?

• JRockit の管理機能を利用する組み込み診断ツール

• 効用• 標準出力をリダイレクトしていなくても、スレッドダンプをファイルに残せる

• verbose ログの出力を再起動なしに変更できる

• メモリリークの調査など、高度な機能も持つ

Copyright© 2009, Oracle. All rights reserved. 8

1. JRockit プロセスのカレントディレクトリにコマンドを記載したファイルを準備する

• WebLogic Server であればドメインディレクトリ直下

• “ctrlhandler.act” というファイル名で、以下のような内容を保存

• 「“ctrlhandler.log” というファイルに、 print_threads コマンド

の結果を追記する」の意

2. JRockit プロセスにシグナル(SIGQUIT)を送る• Linux の場合:kill -3 <PID>

• Windows の場合:Ctrl キーと Break キーを同時に押す

Ctrl-Break ハンドラの使い方

set_filename filename=ctrlhandler.log append=trueprint_threads

Copyright© 2009, Oracle. All rights reserved. 9

便利なコマンドの紹介

• print_object_summary• ヒープで多数を占めているオブジェクトを表示する

(GC実行後の状況を表示)

• print_memusage• ネイティブ部分も含めたメモリの使用量を表示

• timestamp• タイムスタンプを出力する

• print_threads• 通常のスレッド ダンプを出力する

• 利用可能な診断コマンド• http://otndnld.oracle.co.jp/document/products/jrockit/geninfo/diagnos/ctrlbreakhndlr.html#wp1001218

Copyright© 2009, Oracle. All rights reserved. 10

Javaヒープ内のメモリリークオブジェクトの調査

• “ctrlhandler.act” ファイルの例

• # はコメントアウト• set_filename

• 出力結果を JVM 実行カレントディレクトリのmemusage.txt ファイルへ出力。append=true は、同一ファイルに内容を追記

• print_object_summary• java オブジェクトのメモリ使用状況を出力。• GC実行後の使用状況を出力

• increaseonly =true• 前回計測時から増加したオブジェクトのみ表示(デフォルト: false)

# My configuration(2006/7/31)set_filename filename=memusage.txt append=trueprint_object_summary increaseonly= true

Copyright© 2009, Oracle. All rights reserved. 11

Javaヒープ内のメモリリークオブジェクトの調査

• 出力例

--------- Detailed Heap Statistics: ---------59.4% 10715 k 60256 -53k [C8.7% 1564 k 2305 -24k [B8.0% 1443 k 61604 -3k java/lang/String2.8% 500 k 489 +0k [Lweblogic/servlet/utils/URLMatchMap$URLMatchNode;2.6% 468 k 19969 -4k java/util/HashMap$Entry2.0% 367 k 2464 -3k [Ljava/util/HashMap$Entry;1.5% 279 k 4121 -48k [Ljava/lang/Object;1.4% 246 k 1953 -96k [I1.2% 208 k 8906 +0k java/util/Hashtable$Entry

18045kB total ---

--------- End of Detailed Heap Statistics ---

print_object_summary

凡例 :

byte B

char C

int I

array of type [type

reference to classname Lclassname

凡例 :

byte B

char C

int I

array of type [type

reference to classname Lclassname

全体に占める割合, サイズ, インスタンス数, 前回測定してからの増加(減少)数, インスタンス名

Copyright© 2009, Oracle. All rights reserved. 12

Ctrl-Break ハンドラによるメモリ監視の利点

• GUI ベースのツール(Memory Leak Detector)と異なり、

定期的な自動実行を行いやすい• 時系列に沿ってデータが取得できるので、メモリリークしている

オブジェクトを特定可能

• Out Of Memory の発生領域特定に役立つ

• Ctrl-Break ハンドラ関連処理のパフォーマンスへの影響は小さい

• “ctrlhandler.act” の書き換え後、JVM の再起動なくすぐに

反映

Copyright© 2009, Oracle. All rights reserved. 13

Ctrl-Breakハンドラ デモ

• 簡単なメモリリーク Java Application の動作確認

DEMO

Copyright© 2009, Oracle. All rights reserved. 14

簡単なメモリリーク Java Application の動作確認

• 内容• デモでは、Java Runtime ディレクトリ配下にある、拡張子が*.txt のファイルについて、単語数をカウントをします。

• 意図的にインスタンスの増加(メモリリーク)するコードになっています。

• Ctrl-Break ハンドラを使って、インスタンスが増加する様子を確認します。

• ctrlhandler.act の内容• 現在生存しているオブジェクトの数 (型ごと) と、それらが使用するサイズを調べます。set_filename filename=C:¥SeminarDemo¥sample¥jroutput.txt append=true

timestamp

print_object_summary increaseonly=true

DEMO

Copyright© 2009, Oracle. All rights reserved. 15

簡単なメモリリーク Java Application の動作確認

==== Timestamp ==== uptime: 0 days, 00:00:03 time: Fri Apr 10 13:51:39 2009

--------- Detailed Heap Statistics: ---------

48.6% 204k 1527 +204k [C

12.5% 52k 482 +52k java/lang/Class

11.8% 49k 33 +49k [B

9.1% 38k 1631 +38k java/lang/String

5.8% 24k 787 +24k java/util/TreeMap$Entry

2.2% 9k 222 +9k [Ljava/lang/Object;

1.7% 7k 164 +7k [Ljava/lang/String;

0.6% 2k 4 +2k [Ljrockit/vm/FCECache$FCE;

0.6% 2k 44 +2k java/net/URL

421kB total ---

--------- End of Detailed Heap Statistics ---

==== Timestamp ==== uptime: 0 days, 00:00:25 time: Fri Apr 10 13:52:01 2009

--------- Detailed Heap Statistics: ---------

77.2% 1792k 1789 +1743k [B

11.6% 270k 1905 +65k [C

3.4% 78k 3361 +40k java/lang/String

2.3% 53k 487 +0k java/lang/Class

1.8% 41k 1775 +41k WordCount

0.8% 19k 223 +10k [Ljava/lang/Object;

2322kB total ---

--------- End of Detailed Heap Statistics ---

Ctrl-Breakハンドラで、 print_object_summary 情報を採取した結果

“WordCount” インスタンスが、起動時に比べ、1775と増加している。

よって、”WordCount”をインスタンス化している部分が怪しい。

*) 2度目の情報は、GC実行後のもの

全体に占める割合, サイズ, インスタンス数, 前回測定してからの増加(減少)数, インスタンス名

DEMO

Copyright© 2009, Oracle. All rights reserved. 16

簡単なメモリリーク Java Application の動作確認

public class WordCount {

private static List allWords = new Vector();

private byte[] buffer;

public WordCount(String word) {

allWords.add(this);

buffer = new byte[1000];

this.word = word;

count = 1;

}

// 略

}

Vector に “WordCount” インスタンスを加えていくが、それを削除するロジックがなかったことが原因。

DEMO

Copyright© 2009, Oracle. All rights reserved. 17

JRockit Mission Control 概要

Copyright© 2009, Oracle. All rights reserved. 18

JRockit Mission Control 概要

• JRockit 専用のGUI 運用監視ツール• Java アプリなので、Java が動作する環境であれば使用可

• TCP/IP ベースのプロトコルでリモートのJRockitプロセスの運用監視が可能

• JRockit側は以下のオプションでポートを開けるだけ例: -Xmanagement:port=7091, ,ssl=false,authenticate=false

• 機能一覧• 管理コンソール

• CPU 使用率、GC 状況、スレッド状況、メモリ使用状況監視

• JRockit Memory Leak Detector

• 詳細なメモリリーク検出

• JRockit Runtime Analyzer(JRA)

• サーバ環境情報、JVM 設定情報、GC 詳細情報

• プロファイリング機能、簡易メモリリーク検出機能

• Latency Analyzer Toolによる処理遅延箇所の検出

Copyright© 2009, Oracle. All rights reserved. 19

JRockit Mission Control デモ

• Ctrl-Break ハンドラのサンプルを、JRockit MissionControl で見た場合

• JRAレコーディングで採取した情報の紹介

DEMO

Copyright© 2009, Oracle. All rights reserved. 20

参考資料

• JRockit オンラインマニュアル• http://otndnld.oracle.co.jp/document/products/jrockit/webdocs/index.html

• Ctrl-Breakハンドラ• http://otndnld.oracle.co.jp/document/products/jrockit/geninfo/diagnos/ctrlbreakhndlr.html#wp1001207

• JRockit Mission Control• http://otndnld.oracle.co.jp/document/products/jrockit/geninfo/diagnos/intromiscon.html

<Insert Picture Here>

Copyright© 2009, Oracle. All rights reserved. 22