JVM类加载机制(一):类加载的过程

版权声明:欢迎转载,请注明出处: https://blog.csdn.net/u014179251/article/details/86137973

前言

由于JVM真是太博大精深了,很难短时间内一言以蔽之,作为刚接触不久的作者而言,比较难一下记住并理解其中奥秘,所以专门将《JVM类加载机制》以一个系列的文章形式进行记录。每篇相关文章主要记录作者在学习实战中的感悟、理解以及关注点。
本篇博客是介绍类加载过程中的一些关键点。

类加载机制概述

虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。

上述文字精简的道出了java类加载机制,但是其中每一步所涉及的知识点是非常多的。先上一张类的生命周期图:
类的生命周期图.png

类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initiallization)、使用(Using)和卸载(Unloading)这7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。

抛出这些基本概念之后呢,详细的内容比较多,我下面只记录自己深刻理解的一些点。

一些值得注意的点

  • 对于静态字段,只有直接定义这个字段的类才会被初始化,因此通过其子类来引用父类中定义的静态字段,只会出发子类的初始化而不会出发子类的初始化;
  • 通过数组定义来引用类,不会出发此类的初始化,比如Class[] array = new Class[N]不会导致初始化Class类;
  • “准备”阶段是正式为类变量分配内存并设置类变量初始值的阶段。仅包括类变量(static修饰的)而不包括实例变量,实例变量是在对象实例化时随着对象一起分配在java堆中。另外,这里的初始值“通常”(并不是一定)是数据类型的零值。
  • 上面提到“通常情况”下时数据类型的零值,这里相对会有一些“特殊情况”:如果类字段的属性表中存在ConstantValue属性,那么在准备阶段就会被初始化为ConstantValue所指定的值,如下:

public static final int value = 123;

以下是java基本数据类型的零值。
java基本数据类型的零值.png

猜你喜欢

转载自blog.csdn.net/u014179251/article/details/86137973