2

クラスローダーによってロードされたクラスの数をどこで確認できるか知りたいです。知りたいのですが、マークimport付きのクラスのステートメント*がヒープのパーマ領域にそれらの多くのクラスをロードするかどうかを知りたいですか? または、特定の型の参照を宣言した場合にのみ、次の 2 つのクラスが読み込まれますか?
元。

Map m = new HashMap(); //only these two classes loaded???

import 文を次のように書くとどうなるでしょうか

java.util.*;

クラスローダーはjava.utilパッケージの下のすべてのクラスをロードしますか? Javaにクラスのアンロードプロセスはありますか?

4

4 に答える 4

5

いいえ、インポートはクラスのロードとは関係ありません。それは単なる構文糖です。次の 2 つのプログラムは、まったく同じバイト コードを生成します。

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.prefs.*;

public class Foo
{
    private Map map = new HashMap ();
}

public class Foo
{
    private java.util.Map map = new java.util.HashMap ();
}

クラスがロードされる時間は、JVM の決定次第です。Java 仕様は、クラスが最初に使用される前にロードされ初期化されることのみを保証します。

たとえば、1 つの JVM が、アプリケーションの起動前に、メイン クラスによって直接または間接的に参照されるすべてのクラスを再帰的にロードすることを決定する場合があります。このような動作は、クラスのロードによって引き起こされるプログラム実行の非決定的な一時停止を回避する必要があるリアルタイム アプリケーションにとって便利です。別の JVM は、クラスが実際に使用されるまでクラスのロードを延期し、使用されなくなった直後にクラスをアンロードする場合があります。これは、メモリ フットプリントが問題となる組み込みアプリケーションで便利な場合があります。

于 2013-03-13T06:45:41.910 に答える
2

imported クラス (またはワイルドカード) は、実際にはクラス ローダーによってロードされません。import ステートメントは、単に「エイリアス」ステートメント (または、ワイルドカードをインポートする場合の「暗黙のプレフィックス」ステートメントのようなもの) です。

于 2013-03-13T06:45:40.193 に答える
1

実行時にロードされるクラスを見たい場合は、これを試してください:

java -verbose:class

質問を確認する必要がありますClassLoader がロードしたクラスを取得する方法はありますか?

于 2013-03-13T07:02:18.133 に答える
1

このツールVisualVMが役立ちます。

于 2013-03-13T06:41:21.610 に答える