深入理解JVM:类加载过程

一、类的生命周期

其中大框内的统称位连接阶段,解析过程可以在初始化之后。

二、类加载过程

1、加载

类加载过程的第一步,主要完成下面3件事情:

  1. 通过全类名获取定义此类的二进制字节流
  2. 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
  3. 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口

一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的 loadClass() 方法)。数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。

加载阶段完成后,jvm的二进制字节流按所需格式存储在方法区中。

加载阶段与连接阶段交叉进行。

2、验证

这个阶段直接决定了jvm是否能够承受恶意代码攻击,从执行性能上来讲,验证阶段的工作量在jvm的类加载子系统又占了一部分。

éªè¯é¶æ®µç¤ºæå¾

3、准备阶段

正式为类变量分配内存并设置类变量初始值阶段。

(1)进行内存分配包括类变量(static)。

(2)初始值通常情况下是类类型默认零值。

4、解析

是jvm将常量池中符号引用替换成直接引用(类方法、字段在内存中的指针、偏移量)过程。

主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用。

5、初始化

这是类加载的最后一步,这才是真正执行类中定义的java程序代码(字节码)执行类构造器<clinit>方法过程。

<clinit>是由编译自动收集类中的所有变量的复制动作和静态语句块中的语句合并产生的。

发布了134 篇原创文章 · 获赞 91 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/weixin_44588495/article/details/104126638