5

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

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

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

4

2 回答 2

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);

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

于 2012-12-19T15:07:37.427 回答
1

IBM J9 JVM 在堆上没有 PermGen,并将类存储在本机内存中。您可以使用 -Xdump 生成一个 javacore.* 文件,它将包含所有类加载器和类的列表。

顺便说一句:Java8 会做类似的事情。

于 2013-12-08T04:43:51.307 回答