闲谈类加载过程

浅谈一下类加载过程,后续继续补充

类加载过程:加载,验证,准备,解析,初始化,使用,卸载

验证,准备,解析 可以统称为 连接

加载

1)通过类的全限定名获取该类的二进制字节流; 

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

3)在内存中生成一个该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

验证

1)文件格式验证 

2)元数据验证(是否符合Java语言规范) 

3)字节码验证(确定程序语义合法,符合逻辑) 

4)符号引用验证(确保下一步的解析能正常执行)

准备

为静态变量在方法区分配内存,并设置默认初始值

注意

这时内存分配仅包括类变量static,不包括实例变量,实例变量会在对象实例化时随着对象一块分配在java堆中

设置的是默认值,比如int=11,此时初始值是0,11是初始化才会赋值

解析

将常量池中的虚拟引用转换为直接引用的过程

 

初始化

根据程序中的赋值语句主动为类变量赋值

注意:有父类先初始化父类,后初始化子类

系统中的ClassLoder在协同工作的时候会默认使用双亲委派模型。即在类加载的时候,系统会首先判断当前类是否被加载过,已经加载的类会直接返回,否则才尝试加载

双亲委派模型

工作过程是:如果一个类加载器收到了类加载的请求,它首先不会加载类,而是把这个请求委派给它上一层的父加载器,每层都如此,所以最终请求会传到启动类加载器,然后从启动类加载器开始尝试加载类,如果加载不到(要加载的类不在当前类加载器的加载范围),就让它的子类尝试加载,每层都是如此。

好处:

避免类的重复加载

保证了java的核心api不被篡改

猜你喜欢

转载自blog.csdn.net/Goligory/article/details/104467805
今日推荐