类加载机制详解

类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括: 加载(loading),验证(verification),准备(preparation),解析(resolution),初始化(initialization),使用(using)和卸载(unloading)7个阶段,其中验证/准备/解析3个部分称为linking,如下为7个阶段发生顺序:
	加载-> (链接[验证,准备,解析])->初始化->使用->卸载.
	其中加载/验证/准备/初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班开始,但是解析不一定: 在某些情况可以在初始化阶段之后在进行,
以下情况, 必须对类进行初始化(加载,验证,准备自然在此前执行):
	1. new/getstatic/putstatic/invokestatic这4条字节码指令时,如果没有进行过初始化,则需要触发其初始化,对应这些字节码的java代码场景:使用new关键字实例化对象时,读取或设置一个类的静态字段(被final修饰/已在编译期把结果放入常量池的静态字段除外)的时候,以及调用一个静态方法的时候
	2. 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化
	3. 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发父类的初始化
	4. 当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类
	5.当使用jdk1.7动态语言支持时,如果一个java.lang.invoke.methodhandle实例最后的解析结果ref_getstatic,REF_putstatic,REF_invkestatic的方法句柄,并且这个方法句柄所对应的类没有被初始化,则需要先触发初始化.
以上5种方式称为主动引用,除此之外,所有引用类的方式都不会触发初始化,成为被动引用.
加载:加载阶段,虚拟机需要做3件事
	1.通过类的全限定名来获取定义此类的二进制字节流
	2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
	3.在内存中生成一个代表这个类的java.lang.class对象,作为方法区这个类的各种数据访问入口
验证:
	验证为链接的第一步,这一阶段目的是为确保class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全.
	1.文件格式验证(比如version是否匹配)
	2.元数据验证
	3. 字节码验证
	4.符号引用验证
准备:
	准备阶段是正式为类变量分配内存并设置变量初始值的阶段,这些变量所使用的内存都将在方法区分配.
	准备阶段进行内存分配的近包括类变量(被static修饰的变量),不包含实例变量,实例变量将通过对象在实例化时随着对象一起分配在java堆中.这里的初始值通常情况下是数据类型的零值,假设变量 static int v=123; 那么在准备阶段的初始值为0,而不是123.赋值123是在初始化阶段执行.
初始化:
	类初始化阶段是类的加载过程的最后一步,初始化阶段,才真正开始执行类中定义的java程序代码.
	在准备阶段,变量已经赋过一次初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源.初始化阶段就是执行类构造器<client>()方法的过程.
类加载器:
	启动类加载器:bootstrapclassloader 
	扩展类加载器: extensionClassLoader 
	应用程序类加载器:  appclassloader 
	自定义类加载器: urlclassloader
	双亲委派模型:  明显的好处: Java类随着类加载器一起具备一种带有优先级层次关系.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值