『支付宝』java类加载机制,你会了吗?


『支付宝』java类加载机制,你会了吗?
文章图片
『支付宝』java类加载机制,你会了吗?
文章图片
『支付宝』java类加载机制,你会了吗?
什么是类加载机制呢?
java虚拟机将编译后的class文件加载到内存中 , 进行校验、转换、解析和初始化 , 到最终的使用 。 这就是java类加载机制;
下面就开始今天的内容:
1、类加载的生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)等阶段 , 其中验证、准备、解析3阶段也可以称为连接(Lingking) , 如下图:
类的生命周期
2、类加载的时机

在类加载的生命周期中 , 加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的 , 其加载过程一定是按照这个顺序执行的 。 而解析阶段有点特殊 , 在某些特定的情况下 , 它是在初始化之后开始的 。
那什么情况下需要开始类加载的第一个阶段呢?对此 , Java虚拟机规范中并没有进行强制约束 , 并且交给虚拟机的具体实现来自由把握 。 但是对于初始化阶段 , 虚拟机规范则是严格规定了有且只有5种情况(类没有初始化)必须立即对类进行“初始化”(而加载、验证、准备自然需要在此之前开始):1)、遇到new、getstatic、putstatic或invokestaic这四条字节码指令时 。
2)、使用java.lang.reflect包的方法对类进行反射调用的时候 。
【『支付宝』java类加载机制,你会了吗?】3)、当初始化一个类的时候 , 如果发现父类还没有初始化 , 则需要先触发其父类的初始化 。
4)、当虚拟机启动时 , 用户需要指定一个要执行的主类 , 虚拟机会先初始化这个主类 。
5)、当使用JDK1.7的动态语言支持的时候 , 如果一个
class=\"sysbr\">java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄 , 并且这个句柄所对应的类没有进行过初始化 , 则需要先触发器初始化 。
3、类加载过程
接下来详细介绍类加载的几个重要阶段:加载、验证、准备、解析和初始化
3.1、加载
在加载阶段 , 虚拟机主要执行以下三个操作
1)、通过类的全限定名来获取定义这个类的二进制字节流 。
2)、将这个字节流所代表的静态存储结构转化成方法区的运行时数据结构 。
3)、在内存中生成一个代表这个类的Class对象 , 作为方法区这个类的各种数据的访问入口 。
这个阶段相比其他阶段来说 , 是开发人员可控性最强的阶段 。 因为这个阶段既能使用系统提供的加载器(这个加载器后面会进行介绍)加载 , 又能通过开发人员自定义的加载器进行加载 。
在加载这个阶段还有一个需要注意的地方 , 在执行第一个操作时 , 需要知道可以从哪里获取class文件 , 例如:
1)、从压缩文件中读取(JAR , WAR等)
2)、从本地磁盘中获取
3)、从网络上获取(Applet)
4)、运行过程中动态生成(动态代理)
5)、其他文件生成(jsp生成对应的class文件)
6)、从数据库中读取
3.2、验证
验证阶段主要有4个阶段的验证:文件格式验证、元数据验证、字节码验证和符号验证
3.2.1、文件格式验证
这一阶段要验证字节流是否符合Class文件格式的规范 , 并且能被当前版本的虚拟机处理 , 主要包括魔数、版本号、常量池等验证 。


推荐阅读