5

私の理解では、PermGenは(ある意味で)クラスコードをメモリに保持しています。多くの場合、クラスパスを参照するjarファイルがたくさんあります。jarファイルがクラスパス(Tomcatのlibディレクトリなど)に含まれている場合、それらすべてのjarのすべてのクラスが自動的にPermGenにロードされますか?

同様の質問で、jarファイルのクラスが使用されると、PermGenはそのjarファイル内のすべてのクラスをロードしますか、それとも使用されているクラスだけをロードしますか(その後、必要に応じて残りのクラスファイルをロードします)?

4

4 に答える 4

4

これは、クラスローダーと JVM の実装にある程度依存します。Java 仮想マシンの仕様では次のように述べられています。

この仕様により、Java プログラミング言語のセマンティクスが尊重されていれば、アクティビティのリンク (および再帰のため、読み込み) がいつ行われるかについて実装の柔軟性が得られます [...]

たとえば、実装では、クラスまたはインターフェイス内の各シンボリック参照を、それが使用されている場合にのみ個別に解決するか (遅延解決または遅延解決)、またはクラスの検証中にすべてを一度に解決するか (静的解決) を選択できます。これは、一部の実装では、クラスまたはインターフェイスが初期化された後、解決プロセスが続行される可能性があることを意味します。

実際には、JAR ファイル内の 1 つのクラスがロードされたという理由だけで、ましてやクラスパス上にあるという理由だけで、JAR ファイル内のすべてを自動的にロードする適切な実装はありません。

于 2012-05-21T18:28:45.420 に答える
2

PermGenはHotSpotの実装の詳細であり、Oracleは将来的にそれを取り除きたいと述べています[1]。これは、Java(VM)仕様の一部ではありません。ロードされたクラスのみがPermGenになります。明示的にトラフするClassLoader#loadClassか、リンクを介して暗黙的にトラフします。誰かが明示的にすべてのクラスをロードしていない限り、それは使用されるクラス(およびそれらの依存関係)のみである必要があります。それらに反省を実行します。Springのようなフレームワークはこれを回避し、代わりにバイトコードをスキャンします。

注目すべき点は、ロードされたクラスをPermGenで監視できるVisualVMです。

[1] JRockitにはPermGenがなく、最近のHotSpotバージョンでは、文字列インターンプールはPermGenに含まれていません。

于 2012-05-21T19:30:47.860 に答える
0

必要なクラスのみがロードされ、permgenスペースに格納されます。

于 2012-05-21T18:19:41.497 に答える
0

JLSは、クラスが最初に必要になった時点で初期化されることを保証します。ただし、実装は以前にロードとリンクを実行できます。

于 2012-05-21T18:21:15.163 に答える