読者です 読者をやめる 読者になる 読者になる

ux00ff

ビールとプログラミングと

Scalaで書いたProcessing のプログラムを VisualVM でプロファイルする

Processing Scala VIsualVM

ProcessingのプログラムをIntelliJとScalaで開発する で Processing を Scala で書いて実行することはできるようになりました。

Processing でちょっと複雑なコードを書いているとどうしてもパフォーマンスの問題に出会うと思いますが、ここではそんな時に役立つ VisualVM でのプロファイル方法についてメモを記録しておきます。Processingは3系です。

VisualVMの入手

以下からダウンロードしてください。

Mac OS X Application Bundle が提供されていますので、ダウンロードして /Applications に突っ込んでおきましょう。

jstatd の起動

jstatd は 実行中の JVMと外からお話するための純正サーバです。Oracle Java 入れると勝手に入ると思いますが、公式サイトによるとJava仮想マシン(JVM)をモニターし、リモート・モニタリング・ツールをJVMに接続できるようにします。このコマンドは試験的なものであり、サポート対象外になっています。」とのことなのでそれを念頭において一つよろしくお願いいたします。

こいつをローカルで起動しておきますが、対象のVMにアクセスするため、アクセスポリシーファイルを作成します。ここは、上の公式ドキュメントにある通りのポリシーファイルを用意することにしましょう。

grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};

これを jstatd.all.policy という名前で適当な場所に作成しておき、jstatd の起動時に指定します。

jstatd -J-Djava.security.policy=jstatd.all.policy

これだとフォアグラウンドで起動してしまうので、適宜 nohup するなりしてください。

Processing アプリケーションへの接続

うまく jstatd が起動していれば、Processing のコードを実行すると以下のように processing.core.PApplet か、あるいはあなたが作成した Main クラスを実行しているプロセスが見えるはずなので、適当にアタッチしてください。(手元で実行したとき、うまくプロセス掴まないことがありました。何度かやり直したらいけたので何か見落としがあるかも) IntelliJから直接実行している場合、見えるプロセス名は com.intellij.rt.execution.application.AppMain とかだと思います。

f:id:ux00ff:20170201000911p:plain

AWT-EventQueue とか見えるのが懐かしい感じです。 

CPUサンプラを見ると、どのメソッドコールがCPUを消費しているのかを確認することができます。以下に示すのは、OpenCVを利用したビデオ処理のプログラムにアタッチしたものですが、どう見ても VideoCapture#readPGraphincsJava2D#ImageImpl が時間を食っています。

f:id:ux00ff:20170201002028p:plain

ここを見る限りだと、自分で書いてる箇所がボトルネックになってることはなさそうだ、ということがわかりました。

まとめ

ということで、自作のProcessing アプリケーションを jstat と VisualVM でプロファイルすることができました。これで快適にパフォーマンス改善することができます。