文章目录
0、前言
从.java类文件创建,经过JVM编译后生成.class文件,并最终被实例化执行,在这整个过程中,Java文件发生了什么变化?JVM又做了哪些工作?笔者结合《深入理解Java虚拟机》,通过这篇文章和各位探讨分析一下。
1、类加载过程分析
JVM中类加载的全过程包括加载、验证、准备、解析和初始化
1.1、加载阶段
在分析这个过程之前,我们先抛四个问题:
加载什么?从哪里加载?由谁来执行加载?加载过程中需要做哪些工作?
1.1.1、加载什么
自然是加载由.java
文件经JVM编译生成的.class
文件。不过这么说还不算准确,实际上是加载.class
文件的二进制字节流,并将这个二进制字节流中的静态存储结构转化为方法区的运行时数据结构。
首先,我们分析下.class
文件包含哪些东西。.class文件由.java
文件编译而成,自然和.java
文件包含的东西保持一致,这里面包含类本身的一些描述性信息,包括成员变量信息、成员方法信息、构造函数信息等等。当然还包含程序员同学定义的数据结构、实现的算法逻辑等等。通过把这些信息加载到内存,从而生成方法区的运行时数据结构。
1.1.2、从哪里加载
我们知道加载时本质上是加载二进制字节流,从哪里加载,换句话说,就是从哪里获得二进制字节流。来源一般有以下几种:
- 从本地系统中将Java源文件动态编译为
.class
文件 - 通过网络获取(Applet)
- 从zip,jar等归档文件中读取
- 运行时计算生成(动态代理技术)
- 由其他文件生成(JSP)
- 从专有数据库中提取
.class
文件(场景较少)
1.1.3、由谁来执行加载
类的加载由类加载器来执行加载。这里的类加载分为两类:系统引导类加载器和用户自定义加载器(重写一个类加载器的loadClass()
方法)。
类加载器会在下文详细说明。
注:摘自《深入理解java虚拟机》以说明,以下元素类型在原文中叫"组件类型"。
数组不需要通过类加载器创建,而是由JVM直接创建的,但是数据和对象有密切关系,因为数据元素的类