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

时间:2012-12-19 06:46:06

标签: java memory-leaks jvm classloader

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

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

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

2 个答案:

答案 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会做类似的事情。