5

HotSpot JVMjava.lang.Classloaderクラスには、このクラスローダーによってロードされたすべてのクラスの Vector があります。したがって、すべてのクラスは、そのクラスローダが有効である限りメモリに保持されます。IBM JVM J9 の java.lang.Classloader には、そのようなフィールドはありません。少なくとも私は見つけることができませんでした。だから私の質問は:

  1. IBM JVM のクラスローダーはどこにクラス キャッシュを保持しますか?

  2. 上記の点と異なる場合: IBM JVM でクラスをハード参照し、アンロードを妨げているのはどれですか?

4

2 に答える 2

2

私のIBMJVMのコードを見るとjava.lang.ClassLoader、抽象クラスのように見えるので、どこかに実装されます。デバッガーを使用して、それがと呼ばれる合成クラスであることがわかりましたsun.misc.Launcher$AppClassLoader
次に、クラスを取得するためにネイティブメソッド
private native Class findLoadedClassImpl(String className);
があるため、キャッシュはJavaの外部のネイティブメソッドで行われているように見えます。

loadClassメソッドの開始時に、次のように表示されます。

// Ask the VM to look in its cache.
Class loadedClass = findLoadedClass(className);

次に、nullかどうかをチェックしloadedClass、nullの場合は、親クラスローダーを使用しようとします。
したがって、メソッドが継承するクラスローダーによってオーバーライドされない限り、キャッシュはJavaの外部、IBMVMのネイティブコンポーネントで発生します。

于 2012-12-19T15:07:37.427 に答える
1

IBM J9 JVM は Heap に PermGen を持たず、クラスをネイティブ メモリに格納します。-Xdump を使用して javacore.* ファイルを生成できます。このファイルには、すべてのクラスローダーとクラスのリストが含まれます。

ところで:Java8も同様のことを行います。

于 2013-12-08T04:43:51.307 に答える