类加载的五个阶段

本文详细介绍了Java类加载的五个阶段:加载阶段,将字节码转化为二进制字节流加载到内存;连接阶段的验证、准备和解析,确保字节流符合虚拟机要求,分配静态变量内存并进行解析;最后是初始化阶段,执行类的静态初始化代码,保证多线程环境下的正确同步。
摘要由CSDN通过智能技术生成

一、加载阶段

JVM在该阶段的主要目的是将字节码从不同的数据源(可能是class文件,也可能是jar包,甚至网络)转化为二进制字节流加载到内存中,并生成一个代表该类的 java.lang.Class 对象

二、连接阶段–验证

  1. 目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全
  2. 包括:文件格式验证(是否以魔数 oxcafebabe 开头)、元数据验证、字节码验证和符号引用验证
  3. 可以考虑使用 -Xverify:none 参数来关闭大部分的类验证措施

三、连接阶段–准备

JVM 会在该阶段对静态变量分配内存并默认初始化(对应数据类型的默认初始值,如0,0L,null,false等),这些变量所使用的内存都将在方法区中进行分配

四、连接阶段–解析

虚拟机将常量池内的符号引用替换为直接引用的过程

五、初始化 Initialization

  1. 到初始化阶段,才真正开始执行类中定义的java程序代码,此阶段是执行()方法的过程
  2. ()方法是由编译器按语句在源文件出现的顺序,依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并进行合并
  3. 虚拟机会保证一个类的()方法在多线程环境中被正确的加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的()方法,其他线程都需要阻塞等待,直到活动线程执行()方法完毕

请添加图片描述
请添加图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值