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 应用程序和插件时发生的情况。
为什么 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 应用程序和插件时发生的情况。