2

Java プログラムが C++ プログラムよりも多くのメモリを使用することは、確立された事実のようです。StackExchange の回答によると、これはガベージ コレクションの性質と Java の「バイナリ」のバイトコードの性質によるものです。しかし、この場合、リフレクションはどのような役割を果たしているのでしょうか?

Java では、実行時に提供されるプレーン テキストとして、クラスの変数とメソッドを列挙して呼び出すことができます。これを可能にするために、これらの文字列キーをそれぞれの属性にリンクする何らかの種類のメタデータが保存されています。

このメタデータはヒープに保存されていますか?もしそうなら、リフレクションを必要としないクラスに対してそれを無効にする方法はありますか? (昔のデータ)

4

1 に答える 1

2

Java が機能する方法は、permgen と呼ばれるメモリ領域にすべてのクラスをロードすることです。使用可能なクラスは、リフレクションを介して使用するかどうかに関係なく、permgen 領域にロードされます。

リフレクションの使用

Class.forName("MyClass").newInstance() 

反射なし

new MyClass()

上記の両方のステートメントでは、クラスが permgen にロードされている必要があります

このメタデータはヒープに保存されていますか?もしそうなら、リフレクションを必要としないクラスに対してそれを無効にする方法はありますか? (昔のデータ)

そして、それを無効にする方法はありません。

しかし、最も近い方法は、カスタム クラス ローダーを実装してクラスをロードすることです。また、カスタム クラスローダーによってロードされた特定のクラスの使用が終了したら、そのクラスへのすべての参照を解放してアンロードできます。お役に立てば幸いです。:)

于 2014-05-02T20:50:39.507 に答える