03 解读 java类加载

2019-06-20  本文已影响0人  花神子

分析java类加载过程


类加载主要是由jvm虚拟机负责的,过程就可以分为 编译 >>> 类加载 >>> 初始化

java类加载过程

加载(loading)

类加载 (Class Loading)过程的一个阶段。类的加载其实就、是将class文件中的二进制数据读取到内存中,然后将该字节流所代表的静态数据结构转化为方法区中运行的数据结构,并且在堆内存中生成一个java.lang.Class对象作为访问方法区数据结构的入口。
在加载阶段,虚拟机需要完成以下三件事情:

1)通过一个类的全限定名来获取定义此类的二进制字节流。

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

3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。

连接阶段

连接是很重要的一步,过程比较复杂,分为三步 验证 >>> 准备 >>> 解析

验证

验证为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全。不同的虚拟机对验证的实现可能会有所不同,基本都会存在:文件格式验证、元数据验证、字节码验证和符号引用验证。

准备

为类的静态变量分配内存,将其初始化为默认值 。我们都知道静态变量是可以不用我们手动赋值的,它自然会有一个初始值 比如int 类型的初始值就是0 ;boolean类型初始值为false,引用类型的初始值为null 。 这里注意,只是为静态变量分配内存,此时是没有对象实例的.

解析

把类中的符号引用转化为直接引用。解释一下符号引用和直接引用。比如在方法A中使用方法B,A(){B();},这里的B()就是符号引用,初学java时我们都是知道这是java的引用,以为B指向B方法的内存地址,但是这是不完整的,这里的B只是一个符号引用,它对于方法的调用没有太多的实际意义,可以这么认为,他就是给程序员看的一个标志,让程序员知道,这个方法可以这么调用,但是B方法实际调用时是通过一个指针指向B方法的内存地址,这个指针才是真正负责方法调用,他就是直接引用。

初始化

为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,此处赋予的才是程序编写者为变量分配的真正的初始值。

类加载的内存分析

jvm内存模型

类加载的内存分配,通过上面的三件事情知道类加载就是jvm虚拟机将类的.class文件加载到内存,并将它放到运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构(方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据)。

jvm-load2
上一篇下一篇

猜你喜欢

热点阅读