class 对象由 class 加载程序引用?

class object referred by class loader?

为什么 class 对象被 class 加载程序引用?不应该是其他方式吗,即 class loader 应该被引用 如果 class 对象无法访问且内存消耗较少,那么 class 对象可能符合 GC 条件?

我知道我在这里遗漏了一些基本的东西,但不确定是什么。我尝试用谷歌搜索但找不到答案

因为 ClassLoader 加载 类 并且它的职责是知道它加载了什么 类。 Class 对象 引用了加载它的 ClassLoader,因此 Class.[=15= 中的 getClassLoader() 方法]

内存消耗绝对没有与这里的任何事情有关,我无法想象为什么你会这么认为。

如果您查看 class java.lang.ClassLoader 的实现,您会发现 Class 对象的实际实例化发生在 JVM "behind the scenes" 中。 Class 信息通过本地方法(例如 findLoadedClass0)获取,并且 ClassLoader 在必要时调用本地方法 defineClass1 来定义新的 class。这些方法如何实现取决于 JVM。

因此,没有必要为了对象实例化而维护这些引用。但是,正如在 java.lang.ClassLoader:

的源代码中对 Class 对象的 Vector 的注释所述
// The classes loaded by this class loader. The only purpose of this table
// is to keep the classes from being GC'ed until the loader is GC'ed.
// private final Vector<Class<?>> classes = new Vector<>();

结果是,如果您需要释放未使用的 Class 定义的内存,则需要对 ClassLoader 本身进行 GC。如果没有对象包含对 class 加载器加载的任何 classes 的引用,那么您可以忘记对 class 加载器的引用。这正是 JEE 应用程序服务器和 OSGi 容器卸载 Web 应用程序和插件时发生的情况。