类加载机制

本文深入探讨了Java类加载机制,解释了类是如何在运行期间动态加载而非编译时一次性加载,以节省内存资源。详细介绍了类加载的七个阶段:加载、验证、准备、解析、初始化等,以及每个阶段的主要任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

类是在运行期间第一次使用时动态加载的,而不是编译时期一次性加载。因为如果在编译时期 一次性加载,那么会占用很多的内存。

**

类加载包括以下 7 个阶段:
加载(Loading)
验证(Verification)
准备(Preparation)
解析(Resolution)
初始化(Initialization)

  1. 加载
    加载是类加载的一个阶段,注意不要混淆。
    加载过程完成以下三件事:
    通过一个类的全限定名来获取定义此类的二进制字节流。
    将这个字节流所代表的静态存储结构转化为方法区的运行时存储结构。
    在内存中生成一个代表这个类的 Class 对象,作为方法区这个类的各种数据的访问入口。
    其中二进制字节流可以从以下方式中获取:
    从 ZIP 包读取,成为 JAR、EAR、WAR 格式的基础。
    从网络中获取,最典型的应用是 Applet。
    运行时计算生成,例如动态代理技术,在 java.lang.reflect.Proxy 使用
    ProxyGenerator.generateProxyClass 的代理类的二进制字节流。
    由其他文件生成,例如由 JSP 文件生成对应的 Class 类。

  2. 验证
    .确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安
    全。

  3. 准备
    类变量是被 static 修饰的变量,准备阶段为类变量分配内存并设置初始值,使用的是方法区的
    内存。
    实例变量不会在这阶段分配内存,它将会在对象实例化时随着对象一起分配在堆中。
    注意,实例化不是类加载的一个过程,类加载发生在所有实例化操作之前,并且类加载只进行
    一次,实例化可以进行多次。

  4. 解析
    将常量池的符号引用替换为直接引用的过程。
    其中解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 的动态绑定。

  5. 初始化
    初始化阶段才真正开始执行类中定义的 Java 程序代码。初始化阶段即虚拟机执行类构造器
    () 方法的过程。
    在准备阶段,类变量已经赋过一次系统要求的初始值,而在初始化阶段,根据程序员通过程序
    制定的主观计划去初始化类变量和其它资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值