JVM运行和类加载的全过程

类的加载机制

JVM把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成JVM可以直接使用的Java类型的过程。

  1. 加载
    1. 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类文件的java.lang.Class对象,作为方法区类数据的访问接口。-----这个过程需要类加载器参与
  2. 链接
    1. 验证:确保加载的类信息符合JVM规范,没有安全方面的问题
    2. 准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配
    3. 解析:虚拟机常量池内的符号引用替换为直接引用的过程。
  3. 初始化
    1. 初始化阶段是执行类构造器<clinit>()方法的过程。类构造器<clinit>()方法是由编译器自动收集类中所有变量的赋值动作和静态语句块中的语句合并产生的。
    2. 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先将其父类进行初始化。
    3. 虚拟机会保证一个类的<clinit>()方法在多线程环境中能被正确的加锁和同步。
    4. 当访问一个java类的静态域时,只有真正声明这个域的类才会被初始化。

jvm执行类加载的顺序

  1. 首先在一个类中找到主函数。主函数中实例化了一个类
  2. 这时候首先执行这个类中的静态代码块
  3. 在执行类的构造方法,
  4. 然后再执行类中的其他方法

方法区:

  1. 静态变量
  2. 静态方法
  3. 常量池
  4. 类的代码 堆:
  5. java.lang.Class对象 栈:
  6. main方法的栈
静态变量与静态域其实是一回事
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值