2012-04-10 8 views
12

私は最近、この興味深い用語を見つけ、それについて詳しく知るためにネットを検索しました。しかし、私が見つけた情報は不十分です。誰かがplできましたか?これが何であるか、そしてなぜこれが有用なのかについて、幾分詳細な説明を与えてください。Java:JITCのリフレクション・インフレーションとは何ですか?

私が見つけた情報から、このメカニズムが反射型メソッドの実行を高速化し、多くの動的クラスを作成し、パーマネント・メモリ領域を犠牲にしているように見えますが、わかりません。

答えて

13

これを理解するためにいくつかのソースコードを掘り下げてコーディングしました。

Javaの 'Method'クラスには、 'MethodAccessor'というメンバ変数 'methodAccessor'があります。この変数は、メソッドの呼び出しと同様に、メソッド 'invoke'を持つインターフェイスです。メソッドのinvokeデリゲートは、methodAccessorのinvokeに呼び出されます。

インフレが有効な場合(noInflationがfalseの場合)、このアクセサはJNIを使​​用してこのJavaメソッドを実行する実装を指しています(私はGetObjectClass、GetMethodID、Call *メソッドのようなAPIを使用します)。これは、デュエルディスパッチングのようなものであり、JNIによる実行は、これと他の理由により遅くなります。 (What makes JNI calls slow?

反射スルー方式の15回の実行後(「15」がデフォルトであり、変更することができる)とnoInflation偽と、JNIベースのアクセサは、(名前が動的に生成されたその場で、例えばクラスを作成しますたとえば、 'GeneratedMethodAccessor1')には、invokeメソッドもあります。今、この 'invoke'メソッド内では、最初の 'obj'引数を対応するクラスにキャストし、その上のターゲットメソッドを呼び出します。次に、このクラスのインスタンスを作成し、methodAccessorの設定を変更して、以降のメソッドの実行がすべてJNIアクセサの代わりにこのインスタンスに委任されるようにします。これをインフレといいます。

このインスタンスはJavaオブジェクトに委譲するJavaクラスであるため、以降の委任は通常のJava委任です。それはJNIには決して行きません。したがって、オーバーヘッドを節約します。さらに、JITCは他の最適化を実行して効率的になります。

このように多くのメソッドを拡張すると、そのクラスがPermgen空間を占有し、メモリ不足エラーを引き起こす可能性があります。詳細について

は、以下を参照してください。

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/sun/reflect/ReflectionFactory.java

http://java.sun.com/docs/books/jni/html/fldmeth.html

http://anshuiitk.blogspot.com/2010/11/excessive-full-garbage-collection.html

+0

非常に良い説明、ありがとう – ozhan

+0

@Ozhan Duzあなたがそれを気に入ってうれしいです。ありがとう。 – shrini1000

1

わかりませんが、どこか読んでください インフレとは、反映されたメソッド/コンストラクタの最初の数回(既定値15)(これ以降、メソッドへの参照もコンストラクタに適用されます)、JNI ;その後、次回は、その場でクラスファイルをアセンブルしてロードします。その時点で完全なJITが適用され、その反映されたメソッドへの呼び出しは、そのメソッドを直接呼び出すのと同じパフォーマンスを持ちます

+0

はい、私もそれを読んだことがありますが、いくつかの詳細が必要です。リフレクションアクセサーと呼ばれるものがありますが、その方法は正確にはわかりません。 – shrini1000

+0

ここにブログのエントリがあります:http://buzdin.blogspot.com/2011/01/is-java-reflection-really-slow.html基本的に、サーバVMでは、コールサイトが15回以上呼び出された場合反射、ホットスポットは、直接メソッド呼び出しを使用するように最適化します。 BTW、Akash、JNIは関与していません。ちょうど通常のホットスポット最適化です。 – Bill

2

Java InflationJava Reflection APIを通じて行わメソッド呼び出しの最適化です。 infrequentのメソッドコールは安価ですぐに利用できますが、遅いとfrequentのメソッドコールが高速で高価なランタイムgenerated method accessorに呼び出されます。

+0

私は[明確かつ簡潔](http://sites.ieee.org/pcs/communication-resources-for-engineers/style/write-clearly-and-concisely/)の定義を取る。 –

関連する問題