JVM:类加载过程

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

  • 加载

 加载指的是指通过类加载器将类的class文件读入到方法区形成类的信息(属性,方法,构造器的二进制数据),并在堆内存为之创建一个java.lang.Class反射对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象(说明反射类是个泛型类)。可以通过该反射对象去方法区获取类的信息(属性,方法,构造器的二进制数据)。

1.通过“类全名”来获取定义此类的二进制字节流

2.将字节流所代表的静态存储结构转换为方法区的运行时数据结构

3.在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口

  • 链接

 当类被加载之后,系统为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中。

  • 初始化

初始化是执行类构造器 clinit()方法的过程,由编译器自动执行

以语句A a=new A()的过程为例说明:

  1. 首先会在栈中创建一个a,并初始化为null
  2. clinit()方法通过java.lang.Class去方法区获取类的信息,并在堆中创建对象a,并初始化,并返回a的引用地址到栈中的a
  • 类的主动引用 (一定会发生类的初始化)
  1. new一个类的对象
  2. 调用类的静态成员和静态方法
  3. 使用反射对类进行调用
  4. 初始化一个类,会先初始化他的父类
  • 类的被动引用(不会发生类的初始化)
  1. 通过子类调用父类的静态属性时,子类不会初始化
  2. 调用final常量不会初始化类,常量存于常量池中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值