您的位置:首页 > 游戏 > 手游 > 宁波专业做网站的公司_企业网站优化托管_seo外链收录_百度网站客服

宁波专业做网站的公司_企业网站优化托管_seo外链收录_百度网站客服

2025/1/9 2:16:18 来源:https://blog.csdn.net/weixin_57763462/article/details/144463045  浏览:    关键词:宁波专业做网站的公司_企业网站优化托管_seo外链收录_百度网站客服
宁波专业做网站的公司_企业网站优化托管_seo外链收录_百度网站客服

ee5a14664bff41ba95241423729daa18.jpg在JVM(Java虚拟机)中,类加载子系统扮演着至关重要的角色,它负责将Java类加载到JVM中,使其能够被运行和执行。类加载子系统的具体工作过程可以分为以下几个关键步骤:

 

 

1. 加载(Loading)

 

这是类加载过程的第一个阶段。在这个阶段,JVM通过类的全限定名(即包括包名的类名,如com.example.MyClass)来定位并读取类的二进制数据(通常是从.class文件中)。这些二进制数据被加载到内存中,并转换成JVM能够识别的数据结构,存储在方法区(Method Area)中。

 

2. 连接(Linking)

 

连接阶段分为验证(Verification)、准备(Preparation)和解析(Resolution)三个步骤。

 

• 验证(Verification):验证阶段的主要目的是确保加载的类二进制数据是合法且符合Java语言规范的。JVM会进行一系列的字节码检查,以确保类文件没有违反Java语言的语义规则或安全约束。

 

• 准备(Preparation):准备阶段为类的静态变量分配内存,并设置默认的初始值(如int类型的变量默认初始化为0,对象类型的变量默认初始化为null)。但需要注意的是,这里只是分配内存和设置默认值,并不会执行任何初始化代码(如静态代码块)。

 

• 解析(Resolution):解析阶段是将类中的符号引用(如方法名、变量名等)转换为直接引用(如内存地址)的过程。这主要涉及到常量池中的符号引用到方法区中直接引用的转换。

 

3. 初始化(Initialization)

 

初始化阶段是类加载过程的最后一个阶段。在这个阶段,JVM会执行类的初始化代码,包括静态变量的初始化和静态代码块的执行。需要注意的是,只有当一个类被主动使用时(如创建类的实例、访问类的静态变量或静态方法、反射调用类的构造方法等),才会触发类的初始化。

 

类的主动使用和被动使用

 

• 主动使用:

 

    • 创建类的实例。

 

    • 访问类的静态变量或静态方法(不包括通过子类访问父类的静态变量或静态方法,因为这种情况下父类已经被初始化了)。

 

    • 反射调用类的构造方法。

 

    • 初始化一个类的子类(因为子类在初始化时会触发父类的初始化)。

 

    • JVM在启动时指定的要执行的类(包含main方法的类)。

 

• 被动使用:

 

    • 通过子类引用父类的静态变量(不会导致子类初始化,但会触发父类的初始化)。

 

    • 通过数组定义类引用(如Class.forName("java.lang.String[]")),不会触发字符串类的初始化。

 

类加载器的层次结构

 

在JVM中,类加载器也是分层级的,通常包括以下几个层次:

 

• 启动类加载器(Bootstrap ClassLoader):负责加载Java核心类库(如java.lang.*等)。

 

• 扩展类加载器(Extension ClassLoader):负责加载扩展类库(如lib/ext目录下的类库)。

 

• 应用程序类加载器(Application ClassLoader):负责加载应用程序的类路径(classpath)上的类。

 

这些类加载器形成了一个双亲委派模型(Parent Delegation Model),即当一个类加载器需要加载一个类时,它会首先委托给它的父类加载器去加载,如果父类加载器无法加载该类,那么子类加载器才会尝试自己加载该类。这种模型确保了Java核心类库的唯一性和安全性。

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com