トレードロボットを研究・開発しオープンソースソフトウェアとして公開!

/ トップページ / トレードロボットをJavaで自作しよう! / JavaプログラムのパフォーマンスアップやOutOfMemoryError例外対策

JavaプログラムのパフォーマンスアップやOutOfMemoryError例外対策


最適化処理など膨大なデータを繰り返し使う処理で、処理が先に進むほど処理スピードが遅くなったり、OutOfMemoryError例外が発生してしまうことがあります。このような場合はまずプログラムが使用するメモリ量を拡張してみます。それでも解決できない場合はメモリの開放漏れ(メモリリーク)の可能性がありますので「Eclipse Memory Analyzer」を使って調査をします。以下はその手順です。
プログラムが使用するメモリ量を拡張する
javaプログラムの起動時に使用するメモリー量の初期ヒープサイズ(-Xms)、最大ヒープサイズ(-Xmx)、New世代領域サイズ(-Xmn)を指定します。以下が入力例ですが200mのように数字の後ろについているmはメガを意味します。私の場合、かなり負荷の高い最適化でも以下の設定であれば快適に動きます。
C:\>java -Xmn200m -Xms400m -Xmx400m jp.robotbrain.apps.SignalBoxEditor
「Eclipse Memory Analyzer」でメモリの開放漏れ(メモリリーク)の調査をする
  1. 「Eclipse Memory Analyzer」を入手してインストールする
    以下のページで該当OSのファイルをダウンロードします。
    http://www.eclipse.org/mat/downloads.php
  2. ダウンロードしたファイルを解凍します。解凍してできたフォルダの中にある「MemoryAnalyzer.exe」を起動します。
  3. ヒープダンプを作成します。まず調査したいJavaプログラムを実行し、プロセスIDをコマンドプロンプト(Linuxであれば端末)でjpsコマンドを打って調べます。jpsコマンドはJDKをインストールしたフォルダの中のbinフォルダに入っていますので、PATHが通っていなければ通します。以下のようにプロセスIDの一覧が表示されます。
    C:\>jps
    3756 jps
    3904 OptimizeEvolutionary
    次にjmapコマンド(これもJDKのbinフォルダにあります)でヒープダンプを作成します。上記のOptimizeEvolutionaryプログラムのダンプを「c:\work\jmap\heap.bin」に作成する場合は以下のようなコマンドになります。 最後のパラメータに上記で調べたプロセスIDを入力します。
    C:\>jmap -dump:format=b,file=c:\work\jmap\heap.bin 3904
  4. 「Eclipse Memory Analyzer」のメニューから「File」→「Open Heap Dump...」を選び作成したヒープダンプファイルを選択します。
  5. ダイアログが表示されるので「Leak Suspects Report」を選択し「Finish」ボタンをクリックします。
  6. 「Open Dominator Tree」ボタンをクリックします。
  7. リストの見出し「Retained Heap」をクリックして消費の大きいオブジェクトが上にくるようにソートし、消費の大きなオブジェクトのツリーを展開していきます。下記例の場合「java.lang.Thread」の消費が大きいのでそこを展開し、さらにその下の階層では「jp.robotbrain.simulation.OptimizeEvolutionary」というクラスの消費が大きいのでここを展開していきます。これを続けてメモリを確保し過ぎているオブジェクトを探しだします。
手順は以上です。

仕事で身につけたJavaスキルを趣味に活かせるロボットトレーダーの開発について

Copyright (C) 2008 RobotBrain. All Rights Reserved  jp.robotbrain@gmail.com