Java:当类加载器加载时,为类的物理字节分配的内存在哪里?

标签 java classloader

我在虚拟应用程序中构建了一个微型自定义类加载器,以便了解动态类加载的工作原理。对于这个问题,除了提及它实例化我的类加载器的两个不同实例并让每个实例加载不同的类之外,我不需要详细了解它的作用,以便我可以通过确认“ClassNotFoundException"来自其中一个类加载器实例,当只有另一个加载器实例加载了特定类时。

但是,我有一个问题可以很容易地用下面的代码行来表达,希望是不言自明的代码行。

        Class clazz = myClassLoader.loadClass(theClazz);

这行代码使我的自定义类加载器将类字节加载到内存中,并返回该类的 Class 对象的实例。

我的问题是:加载类的物理内存字节位于何处(即 .class 文件的内容)?它们是存储在 ClassLoader 对象中,还是存储在 Class 对象中(因此 ClassLoader 对象仅包含对此 Class 的内部引用object) - 或者完全在其他地方?

最佳答案

类加载器对象有一个它已加载的所有类的集合。

如果同一个物理类被 2 个不同的类加载器加载,则该类的字节在内存中是两倍。这两个类的行为就像不同的类型。他们彼此不相容!字节存储在哪里并不真正相关,我想知道你为什么想知道那个。如果您编写自己的 ClassLoader,您可以将它们“存储”在任何您想要的地方。然而在某些时候你会像这样调用:ClassLoader.defineClass(String, byte[], int, int)。然后创建 VM 内存中的相关结构(MethodArea、ConstantPool 等),如其他答案中所述。

关于Java:当类加载器加载时,为类的物理字节分配的内存在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6068301/

相关文章:

java - java类加载器可以多次加载一个类吗

java - 为什么 "Inside the Java Virtual Machine"说 "NewbornBaby need not be loaded"?

java - 在 Java 中从 inputStream 压缩多个对象

java - 我怎样才能知道点击了哪个按钮?

java - 从 jar 动态加载类

Java ClassLoader 在新线程(Runnable)中使用时停止工作

java - JBoss - 同一应用程序中的不同类加载系统 - 可能吗?

java - 从 Arraylist 返回对象

java - Hibernate 多对多双向 - 双向 @JsonManagedReference 和 @JsonBackReference

java - 在 Spring Rest 模板中设置超时