jol(Java Object Layout)という、Javaのオブジェクトがどのようにメモリ上にレイアウトされるのか?というツールをsbtから便利に使えるようにする

最近公式にopenjdkの一部になったらしい?ので、まだあまり有名じゃないかもしれませんが、以下のような便利ツールがあるの知ってますか?

http://openjdk.java.net/projects/code-tools/jol/


もともと個人で以下のリポジトリで開発されてたらしいです

https://github.com/shipilev/java-object-layout

いくつか機能があるみたいですが、とりあえずorg.openjdk.jol.info.ClassLayoutというのが、なにか大量に同じクラスのインスタンスを生成する予定があって(たとえばActorとか?)
「それぞれのclassのインスタンスが、何バイト消費するんだろう?」
というのを正確に知って、全体のメモリ消費量の予測に役立てたりするのにとても便利っぽいです。*1試してないですが、原理的にJavaだろうがScalaだろうがClojureだろうが、JVM言語ならなんでもいけると思います。

たしかtwitter社も同じようなもの作っていたり、他にも似たようなものある気がします。だれか比較記事書いてください。とりあえず、openjdkで公式?なのは安心感ありますね。


さて、使い方ですが、java.lang.Class渡して、返ってきたオブジェクトに対してtoPrintable呼ぶとかだけ覚えれば、最低限使えます。使うのはとても簡単です。Object Layoutの表示以外の機能(インスタンス自体の参照辿って表示する機能)とか、そもそもコマンドラインからjarにパス通して使えるとか色々あるみたいです。詳細は公式にドキュメントとサンプルコード結構あるのでそれを読みましょう。


openjdkのドキュメントページは、自分が見た時点では、なぜか独自ビルドするやり方書いてありますが、普通にmaven centralにあるので、そこからとってきて使えばいいと思います。


さて「sbtから便利に使えるようにする」とは、たんにsbtコンソールから実行できるようにするのと、クラス名のタブ補完が効くようにしてみただけです。
以前作ったsbt-class-diagramというpluginの仕組みを大体コピペして整理して流用しました。

https://github.com/xuwei-k/sbt-class-diagram


sbt pluginにしてリリースしてもいいんですが、それほどすごいことしてるわけでもないし、とりあえず上記のコードだけ晒しておきます。誰かこれを元にsbt plugin作ってくれてもいいですよ?sbt plugin化は、気が向いたら自分でやるかもしれないし、やらないかもしれません。

*1:あくまでも自分が思いついた使用例であって、もちろん他にも色々使えるでしょう