当前位置: 首页 > 知识库问答 >
问题:

如果两个用户定义的类加载器加载同一个类,JVM如何在内部处理?

周和安
2023-03-14

JVM如何进行内部管理

  1. 如果在两个不同的用户定义的类装入器中装入相同版本的类装入?

2.如果在两个不同的用户定义类加载程序(相同的类名和包)中加载不同版本的类。如果JVM加载了将在我的应用程序中引用的两个类。

我们知道JVM在类、包

我想知道JVM内部如何处理这些情况。

共有2个答案

陶成济
2023-03-14

JVM将它们视为不同的类。不同类加载器的元数据是隔离的,因此类是否具有相同的名称并不重要。

每个类加载器都有自己的元块来存储类元数据。

吕越彬
2023-03-14

在JVM实例中,有关加载类型的信息存储在内存中称为方法区域的逻辑区域中。对于它加载的每种类型,JVM在方法区域中存储不同类型的信息,包括:类型的完全限定名称类型是类还是接口对类类加载器的引用-关于用于加载此类型的类加载器的信息

 类似资料:
  • 我试图修改几个类的字节代码,这些类的打包jar文件不在类路径中-它们是在给定URL的运行时由自定义的加载的。我尝试使用和来拦截那些类,但失败了。类加载器是遗留项目的一部分,因此我无法直接对其进行更改。 代理可以很好地处理AppClassLoader“本地”加载的类,但只会忽略那些由自定义类加载器加载的类。 CustomClassLoader: 我的代理中使用的ClassFileTransforme

  • 如果我有一个内部类声明,例如: 其次是: A$B内部类也会加载吗?如果B内部类没有被声明为“静态”呢?

  • 我有一个类,它实现了接口。类由system classloader加载,接口在第三方组件中定义,我认为第三方组件将接口加载到另一个类加载器(动态类加载器)中。 当我试图创建的新实例时,我得到的是的。我想这是因为它是由不同的类加载器加载的。 我尝试创建(与Guice使用的类似),然后从system类加载器加载类,并从另一个类加载器加载所有其他类,我认为这是用于的类加载器,但没有成功。 有办法绕过它吗

  • 主要内容:1.类加载过程,2.类加载时机,3.类加载器,4.类加载机制:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。 1.类加载过程 1.1加载 加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Cl

  • 在我们的一个生产环境中,我们有一个混乱的结构,tomcat WEB-INF/具有配置和/用罐子放。 我们发现类目录有一个遵循包结构的目录,如下所示,示例: com/test/A.class 在lib目录中,我们还有另一个打包了相同类的jar。 当我们发现重复处理正在发生时,真正的问题就被调查了,尽管不确定问题是否是因为这个。 实际的问题是,tomcat何时启动?是否会创建同一类的两个实例并进行并行

  • 问题内容: 假设我有以下课程: 将执行此行: 导致JVM加载类,还是将类加载推迟到调用该方法之前? 问题答案: 仅当您需要有关该类的信息时才加载该类。 第(2)和(3)行将导致该类被加载。Something.class对象包含仅来自类定义的信息(第(2)行),因此您需要加载该类。对构造函数(3)的调用显然需要类定义。对于该类上的任何其他方法类似。 但是,第(1)行不会导致类被加载,因为您实际上不需