2011-06-28 13 views

答えて

17

はい、おそらく反射の最適化です。

Sun JVMでは、プロパティとメソッドへの反映アクセスは、JNIを介してJVM実装に呼び出すことによって最初に実行されます。 JVMはメソッドやフィールドがリフレクションによって多くアクセスされていることに気づいた場合、同じことを行うためのバイトコード、つまり "インフレーション"というメカニズムを生成します。これには最初のスピードがありますが、その後は約20倍速くなります。あなたが多くの反省をするなら、大きな勝利。

バイトコードは、DelegatingClassLoaderインスタンスによって作成されたクラスに存在します。それに気をつけてください:これらのクラスは、Permgen空間に圧力をかけ、恐ろしい "java.lang.OutOfMemoryError:PermGen space"の失敗を引き起こします。問題がある場合は、システムプロパティーsun.reflect.inflationThresholdを0(ゼロ)に設定して、インフレーションをオフにすることができます。

+0

警告:このプロパティはOracle/OpenJDKとIBM JDKで動作しますが、IBMではインフレーションをオンにします。すぐにそれが膨らんでいます(これは、-verbose:classを使用して試行しました。DelegatedClassLoaders Beeingをインスタンス化したものです。利用できません)。どちらのデフォルト値も15ですが、インフレーションを減らすためにそれを1000などに設定することを考えていましたが、スピードアップの恩恵を受けています。 – eckes

3

ゼロの設定は機能をオフにすることをコード

http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/reflect/ReflectionFactory.java.html

http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/reflect/NativeMethodAccessorImpl.java.html

を見たとき、私は、(少なくとも、ホットスポットのために)表示されません。私にはsun.reflect.inflationThresholdの大きな値だけが仕事をしてくれると思う。

+0

IBMは動作が異なり、0または1でオフになります(0または1では何も変わらないが、両方ともDelegatingClassLoaderがロードされていないとわかりません)。 – eckes

関連する問題