トップページコラム > > IBM HeapAnalyzerで大きなHeapDumpを開く方法





IBM HeapAnalyzerで大きなHeapDumpを開く方法

作成日: 2013年10月30日
更新日: (なし)

IBM JavaのHeapDump解析ツール

OutOfMemoryが発生したJavaアプリケーションのHeapDumpを解析する必要がありました。 今回は実行環境がAIX上のIBM Javaだったので、HeapDumpはIBM Javaフォーマットで出力されています。 そのため、Sun Java相手の有名どころのツールは使えませんでした。 ざっと調べたところ、IBM HeapAnalyzerが良さそうだったので使うことにしました。

解析ツールがOutOfMemory

ミイラ取りがミイラになる話は聞いたことがあると思います。 今回はOutOfMemoryを解析するツールがOutOfMemoryになるという話です。

HeapAnalyzerのOutOfMemoryエラーの画像

左の画像はHeapAnalyzerで大きなHeapDumpを解析しようとした時に発生したOutOfMemoryです。 ファイルをOpenした後の「Analyzing Java Heap Dump」で発生してしまいました。

HeapAnalyzerで解析しようとした「大きなHeapDump」のサイズ感ですが、ファイル・サイズは約686MBありました。 AIX上のIBM Java 32bitで最大ヒープ・サイズ(Xmx)を1,536MBと指定してJavaアプリケーションを実行し、OutOfMemoryが起きて出力されたHeapDumpです。

一方、HeapAnalyzerを起動させたのはWindows 7 64bitのパソコンです。 そのパソコン上のIBM Java 32bitで最大ヒープ・サイズを2,047MBと指定してHeapAnalyzerを起動し、上述のHeapDumpを解析しようとしたらOutOfMemoryが発生するという状況でした。 Xmxに2,047MBはWindows版のIBM Java 32bitで指定できる最大値です。

64bit Javaを使って解決

解決方法は「64bit Javaを使ってより大きなヒープを割り当てる」でした。 解析しようとしていたHeapDumpは32bit Javaの環境で出力されていたので、HeapAnalyzerを起動するJavaも32bit Javaで揃える必要があると思い込んでいて手間取りました。 Javaの32bitと64bitの関係を理解していれば当たり前のことだったのかも知れません。

以下はWindows 7上のIBM Java 32bitで最大ヒープ・サイズに最大値を1MB超える2,048MBを指定してHeapAnalyzerを起動させようとしてエラーになっているものです。 HeapAnalyzerは「C:¥」直下に「ha452.jar」というファイル名で配置しています。

IBM Java 32bitでXmxに2,048MBを指定
C:¥ibm-java_32¥jre¥bin>java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build pwi3270sr5-20130619_01(SR5))
IBM J9 VM (build 2.6, JRE 1.7.0 Windows 7 x86-32 20130617_152572 (JIT enabled, AOT enabled)
J9VM - R26_Java726_SR5_20130617_1436_B152572
JIT - r11.b04_20130528_38954ifx1
GC - R26_Java726_SR5_20130617_1436_B152572
J9CL - 20130617_152572)
JCL - 20130616_01 based on Oracle 7u25-b12

C:¥ibm-java_32¥jre¥bin>java -jar -Xms2048M -Xmx2048M C:¥ha452.jar
JVMJ9VM015W ライブラリー j9gc26(2) の初期化エラー: ヒープのインスタンス化に失敗しました。2G が要求されました
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
C:¥ibm-java_32¥jre¥bin>

次はREHL 6.2のIBM Java 64bitでXmxに4,096MBを指定してHeapAnalyzerを起動させたものです。 先のWindows 7のパソコンは物理メモリーに余裕がなかったので、別マシンで実行することになりました。 こちらではHeapAnalyzerは「/opt/usr/HeapAnalyzer」下に「ha452.jar」というファイル名で配置しています。

IBM Java 64bitでXmxに4,096MBを指定
# /opt/usr/ibm-java_64/jre/bin/java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build pxa6470sr5-20130619_01(SR5))
IBM J9 VM (build 2.6, JRE 1.7.0 Linux amd64-64 Compressed References
20130617_152572 (JIT enabled, AOT enabled)
J9VM - R26_Java726_SR5_20130617_1436_B152572
JIT - r11.b04_20130528_38954ifx1
GC - R26_Java726_SR5_20130617_1436_B152572_CMPRSS
J9CL - 20130617_152572)
JCL - 20130616_01 based on Oracle 7u25-b12
#
# /opt/usr/ibm-java_64/jre/bin/java -jar -Xms4096M -Xmx4096M /opt/usr/HeapAnalyzer/ha452.jar

HeapAnalyzerのメイン画面の画像

64bit Javaで大きなヒープを割り当てることで、Windows版 32bit Javaの最大ヒープ・サイズでもOutOfMemoryで扱えなかったHeapDumpをHeapAnalyzerで解析することができました。

AIX 6.1 64bitのIBM Java 32bit上で動くJavaアプリケーションが出力したHeapDumpを、REHL 6.2 64bitのIBM Java 64bit上で動くHeapAnalyzerで解析した格好です。

HeapAnalyzerは素晴らしいツールでした。 もっと小さいヒープでも動けば言うことなしです。 最大ヒープ・サイズを1,536MBに指定してOutOfMemoryになったHeapDumpでこの調子です。 もっと大きなHeapDumpになると物理メモリーが潤沢に載ったマシンを探すのに苦労しそうです。

Windows版 IBM Javaの入手場所

もう1つ苦労したのがWindows版 IBM Javaの入手場所です。 HeapAnalyzerでIBM JavaのHeapDumpを解析するには、IBM Java上でHeapAnalyzerを実行しなければなりません。 最新のWindows版 IBM Java 7は単体では提供されている場所を見つけられませんでした。 IBM developerWorksのJava Technology Communityの掲示板に「単体では提供されていない。WAS CEIBM Development Package for Eclipseから取り出せ!」という書き込みがあったので、今回は約300MBあるIBM Development Package for Eclipseをダウンロードして取り出す方法で対処しました。

AIXやLinuxなど他のプラットフォーム版のIBM JavaはIBM developer kitsのページから入手できます。

更新履歴

更新日 更新内容
2013年10月30日 新規作成