为什么类对象是由类加载器引用的?如果不是其他方式,即应该引用类加载器 如果类对象无法访问且内存消耗较少,那么类对象可能符合GC条件?
我知道我错过了一些基本的东西,但不知道是什么。我试过谷歌搜索但找不到答案
答案 0 :(得分:2)
因为ClassLoader
加载了类,它的职责是知道它加载了哪些类。 Class
个对象也引用了加载它的ClassLoader
,因此Class
中的getClassLoader()方法。
内存消耗绝对没有与这里的任何事情有关,我无法想象为什么你会认为它。
答案 1 :(得分:0)
如果你看一下java.lang.ClassLoader类的实现,你会发现Class对象的实际实例化发生在幕后"由JVM。类信息通过本机方法(例如findLoadedClass0)获得,ClassLoader调用本机方法defineClass1以在必要时定义新类。如何实现这些方法取决于JVM。
因此,为了对象实例化的目的,没有必要维护这些引用。但是,当状态在java.lang.ClassLoader的源代码中对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<>();
结果是,如果你需要释放未使用的类定义的内存,你需要GC自己的ClassLoader。如果没有对象包含对该类加载器加载的任何类的引用,并且您可以忘记对该类加载器的引用,那么这是可能的。这正是JEE应用程序服务器和OSGi容器在卸载Web应用程序和插件时发生的情况。