类加载过程

类加载过程

加载–》验证–》准备—》解析—》初始化—》使用—-》卸载

其中 在准备阶段完成 成员变量初始值赋值 0 、 0.0之类

加载

1、将java字节码以二进制的方式读入到jvm内存中,然后将二进制数据流按照字节码规范解析成jvm内部的运行时数据结构
2、对外暴露加载结构 更广泛的加载类

(1) 从本地文件系统中读取

(2) 从网络上加载(典型应用:java Applet)

(3) 从jar,zip,war等压缩文件中加载

(4) 通过动态将java源文件动态编译产生(jsp的动态编译)

(5) 通过程序直接生成。

验证

1、文件格式验证(这一步会与装载阶段交叉进行),元数据验证,字节码验证,符号引用验证(这个阶段的验证往往会与解析阶段交叉进行)。

准备

int,byte,char,long,float,double 默认初始值为0

boolean 为false(在jvm内部用int表示boolean,因此初始值为0)

reference类型为null

对于final static基本类型或者String类型,则直接采用常量值(这实际上是在编译阶段就已经处理好了)。

解析

1、类的常量池中的类,字段,方法,接口的符号引用,将他们替换成直接引用的过程

CONSTANT_Class_info
CONSTANT_Fieldref_info
CONSTANT_Methodref_info
CONSTANT_InterfaceMethodref_info

初始化

1、根据用户程序中的初始化语句为类的静态变量赋予正确的初始值

2、执行时机

(1) 通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法(对应new,getstatic,putstatic,invokespecial这四条字节码指令)。

(2) 通过反射方式执行以上行为时。

(3) 初始化子类的时候,会触发父类的初始化。

(4) 作为程序入口直接运行时的主类。

类加载器

类加载器:启动类加载器、扩展类加载器、应用类加载器、自定义加载器

自定义加载器:
比如tomcat:CommonClassloader—CatalinaClassLoader、ShareClassLoader、WebappClassLoader、JspClassLoader

双亲委派模型

1、当一个类触发init方法进行初始化、先判断是否已经加载、没有的话交由父类classloader进行初始化、父类不存在使用启动类加载器初始化、父类的加载器加载失败则使用自己的classloader加载启动