在HotSpot中,JVM java.lang.Classloader
类具有此类加载器加载的所有类的Vector。所以只要他们的类加载器还活着,所有类都保存在内存中。在IBM JVM J9的java.lang.Classloader中没有这样的字段。至少我找不到一个。所以我的问题是:
IBM JVM的类加载器在哪里持有类缓存?
如果与上述不同:IBM JVM中的哪些硬引用类,从而防止卸载?
答案 0 :(得分: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
是否为空,如果是,则尝试使用父clasloader
所以,我要说的是,除非继承类加载器覆盖了该方法,否则缓存发生在Java之外的某些本机组件中。
答案 1 :(得分:1)
IBM J9 JVM在堆上没有PermGen,并且将Classes存储在本机内存中。您可以使用-Xdump生成一个javacore。*文件,它将包含所有类加载器和类的列表。
BTW:Java8会做类似的事情。