java インライン展開

VMOptions
http://mage.oops.jp/pyuki/wiki.cgi?VMOptions

http://docs.sun.com/app/docs/doc/816-3973/6ma7ftaqh?l=ja&a=view

  • XX:MaxInlineSize =

インライン化されるメソッド内のバイトコード命令の最大数を指定する整数。

privateメソッドはインライン展開される
finalメソッドは?

最適化/メソッドのインライン化
http://www.asahi-net.or.jp/~dp8t-asm/java/tips/OptMethodInline.html

メソッドのインライン化に関して以下のようなTipsにまとめてみました。

インライン化を行いたいメソッドはprivateにする
同一ファイルの別クラスに対して公開するメソッドはfinalにする
publicでないクラスはできるだけ同じファイルにまとめる
インナクラスはpublicでも同じファイルに入れることができるので便利
public finalはできるだけ使わない

メソッドのインライン化
http://www.nextindex.net/java/perform/tips.html

メソッド呼び出しは、ヒープ上の呼び出し元のインスタンスから、スタックに積み上げられた参照を経由して、ヒープ上に展開されたメソッドへと辿ります。メソッド呼び出し元と実装の間には、内部的には複数個のポインタを経由する必要があります。一方、一部のメソッドでは、ヒープ上の呼び出し箇所に、スタックへのポインタの代わりに、実行されるメソッドの実装を展開することが可能となります。これを、インライン化と呼びます。オーバーヘッドは掛かりますが、多段組のポインタを経由するよりも、高速にコンピュータ制御が実行対象コードに到達できます。
インライン化を促進する仕組みの一つがアクセス修飾子のprivateと、クラス・メンバーを宣言するstaticです。private修飾子は、当該クラス内からしか参照できません。従って、private修飾されたインスタンス・メソッドへは、他の参照を気にせず、インライン化が可能なのです。また、static修飾子は、インスタンスに依存しないクラス型のメンバーを宣言します。従って、static修飾されたメソッドも、他への参照を気にせず、インライン化が可能となります。
一方、private修飾子は、自動的にfinalを意味します。final修飾子は、修飾対象によって、意味が異なります。
クラスのメンバー変数の場合は変数値の変更不可
インスタンス・メソッドの場合は、継承クラスでのオーバーライド不可
クラスの場合は、継承不可
JDK 1.1相当のJVMに関する記述で、「final修飾されたメソッドはインライン化されるために高速である」との記述を見ることがあります。しかし、少なくともSDK 1.2相当以上のJVMでは、final修飾することによるパフォーマンス上の利得はあまり確認できません。パフォーマンスを目的としてfinal修飾することは、継承というオブジェクト指向設計の柔軟性を無効化する仕組みであって、相当の理由が無いのであれば慎むべきです。
修飾子privateは、オブジェクト指向設計カプセル化と言う観点の下で、積極的に推奨されます。極限的なケースでは、全てのメソッドはprivateであるべきです。その中から、なにを外部のクラスに対して公開すべきであるのかを考えて、当該クラスの外部に対するインタフェースとなるメソッドを抽出します。必要に応じて外部に公開するという方針を採ることで、設計段階で不要なロジックを排除することにも繋がります。
修飾子staticは、インスタンスに依存するメンバーではなく、クラスに固有の共通機能を提供するために使われます。フィールド変数にオブジェクトを保持するような場合に、インスタンスごとに分けて持つ必要が無ければ、static修飾することで、生成されるオブジェクトの個数を減らすことができます。メソッドの場合も、インスタンス毎にコピーされることが無いために、ポインタとメモリの節約につながります。
パフォーマンス目的でのfinal修飾子が、設計に悪影響を及ぼす場合は、使うのは止めましょう。static, ptivate修飾子は、積極的に利用して、最低限度な物だけ、インスタンスのインタフェース・メソッドとして公開しましょう。