IBM JVM类加载器如何保存类?

Nik*_*kem 5 java jvm memory-leaks classloader

在HotSpot中,JVM java.lang.Classloader类具有此类加载器加载的所有类的Vector.所以只要他们的类加载器还活着,所有类都保存在内存中.在IBM JVM J9的java.lang.Classloader中没有这样的字段.至少我找不到一个.所以我的问题是:

  1. IBM JVM的类加载器在哪里持有类缓存?

  2. 如果与上述不同:IBM JVM中的哪些硬引用类,从而防止卸载?

Jac*_*far 2

查看我的 IBM JVM 的代码,它似乎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);
Run Code Online (Sandbox Code Playgroud)

然后它检查是否loadedClass为空,如果是则尝试使用父类加载器。
因此,我想说,除非该方法被继承的类加载器覆盖,否则缓存发生在 Java 外部、IBM VM 的某些本机组件中。