jvm类加载机制

参考:http://blog.csdn.net/boyupeng/article/details/47951037

加载—连接(验证—准备—解析)—初始化—使用—卸载

一、加载
1.通过“类全名”来获取定义此类的二进制字节流
2.将字节流所代表的静态存储结构转换为方法区的运行时数据结构
3.在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口
二、验证
1.文件格式验证
2.元数据验证:对字节码描述的信息进行语义分析,包括顶级父类Object验证、final是否被继承、抽象类的子类是否实现了相关抽象方法等
3.字节码验证:保证被校验类的方法在运行时不会做出危害虚拟机安全的行为,例如:不能把一个父类对象赋值给子类数据类型
4.符号引用验证:比如权限修饰符
三、准备
为类变量分配内存并设置类变量初始值并在方法区中分配内存,但并不是初始化,比如

public static int i = 100;

准备过程只是为i设置初始值0,并不进行变量初始化
四、解析
虚拟机常量池内的符号引用替换为直接引用的过程,在执行anewarry、checkcast、getfield、instanceof、invokeinterface、invokespecial、invokestatic、invokevirtual、multianewarray、new、putfield和putstatic这13个用于操作符号引用的字节码指令之前,先对它们使用的符号引用进行解析
1.类、接口的解析
2.字段解析
3.类方法解析
4.接口方法解析
五、初始化
初始化阶段是执行类构造器<clinit>()方法的过程,类构造器<clinit>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的,一下四个场景会触发初始化:
1.遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需先触发其初始化。生成这4条指令的最常见的java代码场景是:使用new关键字实例化对象、读取或设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)的时候,以及调用类的静态方法的时候。
2.使用java.lang.reflect包的方法对类进行反射调用的时候
3.当初始化一个类的时候,如果发现其父类还没有进行过初始化、则需要先出发其父类的初始化
4.jvm启动时,用户指定一个执行的主类(包含main方法的那个类),虚拟机会先初始化这个类

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值