java类加载之总体概述

我们知道,java类文件在编译之后,会变成class字节码,java程序运行实际上是java虚拟机执行该class文件。那么,这样的class文件如何被jvm读取并在jvm中执行的呢?这就是java的类加载机制,本文是作者阅读许多文章,翻阅部分源码整理而来。
class文件在jvm中的生命周期大概可以分为装载—-验证—-准备—-解析—–初始化—-使用—–卸载这七个阶段,类加载主要指的是前五个阶段,其中验证、准备、初始化三个阶段一般统称为链接,所以,java类加载一般指装载、链接、初始化三个阶段。如下图:
java类加载之总体概述
下面就来详细解释一下各个阶段所做的事情:

  1. 装载:通过类的全限定类名将class文件从classpath、文件系统等地方查找到并导入jvm,这部分工作是由类加载器完成的;
  2. 验证:检查装载的class文件的完整性、安全性等,因为class文件实际上是可以被修改的,如果加载了被修改的class文件,可能会对jvm产生安全性威胁。验证就是校验class的正确性,确保不会加载有威胁的、残缺的class文件;
  3. 准备:为类的静态变量分配存储空间,为初始化做准备。非静态变量是在类实例化的时候分配堆区的内存,不在准备阶段分配。由于类的静态资源是固定的,所以这一步分配的存储空间也可以随之确定;
  4. 解析:将符号引用转换为直接引用,这一步不是必须的,可以在初始化的时候再做;
  5. 初始化:对类的静态变量,静态代码块执行初始化操作。这里使用的内存区域是准备阶段分配好的内存空间。这一步所做的才是程序员定义的主观逻辑。

    其后会对类装载、类加载器、初始化做详细的博文。