附一张图方便理解,一个类的执行过程

类的加载过程,简明的来说


  类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤:

  1. 装载:查找和导入Class文件;
  2. 链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:
    1. 校验:检查载入Class文件数据的正确性;
    2. 准备:给类的静态变量分配存储空间;
    3. 解析:将符号引用转成直接引用;
  3. 初始化:对类的静态变量、静态代码块执行初始化工作。

  类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java执行时系统组件,它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。其中,根装载器不是ClassLoader的子类,它使用C++编写,因此我们在Java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE目录ext中的JAR类包;AppClassLoader负责装载ClassPath路径下的类包。

关于这三个ClassLoader的详解博客链接

一、加载


  “加载” 是“类加载”过程的一个阶段。在加载阶段,虚拟机需要完成以下3件事情:

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

  虚拟机规范的这3点要求其实并不算具体,因此虚拟机实现与具体应用的灵活度都是相当大的。

  相对于类加载过程的其他阶段,一个非数组类的加载阶段(准确地说,是加载阶段中获取类的二进制字节流的动作)是开发人员可控性最强的,因为加载阶段既可以使用系统提供的引导类加载器来完成,也可以由用户自定义的类加载器区完成,开发人员可以通过定义自己的类加载器去控制字节流的获取方式(即重写一个类加载器的loadClass()方法)。

  对于数组类而言,数组类本身不通过类加载器创建,它是由Java虚拟机直接创建的。但数组类与类加载器任然有很密切的关系,因为数组类的元素类型最终是要靠类加载器去创建。

  加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,方法区中的数据存储格式由虚拟机实现自行定义,虚拟机规范未规定此区域的具体数据结构。然后在内存中实例化一个java.lang.Class类的对象(并没有明确规定是在Java堆中,对于HotSpot虚拟机而言,Class对象比较特殊,它虽然是对象,但是存放在方法区里面),这个对象将作为程序访问方法区中的这些类型数据的外部接口。

  加载阶段与连接阶段的部分内容(如一部分字节码文件格式验证动作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的内容,这两个阶段的开始时间仍然保持着固定的先后顺序。

二、验证


  验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

  Java语言本身是相对安全的语言,使用纯粹的Java代码无法做到注入访问数组边界意外的数据、将一个对象转型为它并未实现的类型、跳转到不存在的代码行之类的事情,如果这样做了,编译器将拒绝编译。

  但前面已经说过,Class文件并不一定要求用Java源码编译而来,可以使用任何途径产生,甚至包括用十六进制编辑器直接编写来产生Class文件。在字节码语言层面上,上述Java代码无法做到的事情都是可以实现的,至少语义上是可以表达出来的。

  虚拟机如果不检查输入的字节流,对其完全信任的话,很可能会因为载入了有害的字节流而导致系统崩溃,所以验证是虚拟机对自身保护的一项重要工作。

三、准备


  准备阶段是正式为类变量分配内存并设置类变量初始值得阶段,这些变量所使用的内存都讲在方法区中进行分配。这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在Java堆中。其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量的定义为:

public static int value = 123;

  那变量value在准备阶段过后的初始值为0而不是123,因为这时候尚未开始执行任何Java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器<clinit>()方法之中,所以把value赋值为123的动作将在初始化阶段才会执行。

四、解析


  解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。

五、初始化


  类初始化阶段是类加载过程的最后一步,前面的类加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。到了初始化阶段,才真正开始执行类中定义的Java程序代码(或者说是字节码)。

  在准备阶段,变量已经赋过一次系统要求的初始值,而在初始化阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源,或者可以从另外一个角度来表达:初始化阶段是执行类构造器<clinit()>方法的过程。

JVM——类的加载过程相关推荐

  1. JVM:类的加载过程

    文章目录 类的生命周期 一.加载 二.连接 1.验证 2.准备 3.解析 三.初始化 四.卸载 类的生命周期 一个类的完整生命周期如下: Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟 ...

  2. 从JVM看类的加载过程与对象实例化过程

    一. 类的加载过程 1. 类的加载过程大致是个什么过程? 我们编写产生.java文件,这些.java文件经过Java编译器编译成拓展名为.class的文件,.class文件中保存着Java代码经转换后 ...

  3. JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制

    一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...

  4. Java虚拟机中 类的加载过程

    Java中 类的加载过程 例如下面的一段简单的代码 public class HelloWorld {public static void main(String[] args) {System.ou ...

  5. Java类的加载过程详解 面试高频!!!值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话: 八小时内谋生活,八小时外谋发展. 望别日与 ...

  6. java类加载过程_面试官:java类的加载过程

    Java 类加载机制 类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段. 其中类加载过程包括加载.验证.准备.解析和初始化五个阶段. 类的加载 ...

  7. 中yeti不能加载_第二十章_类的加载过程详解

    类的加载过程详解 概述 在 Java 中数据类型分为基本数据类型和引用数据类型.基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载 按照 Java 虚拟机规范,从 Class 文件到加载到内 ...

  8. Java类的加载过程,类加载器,双亲委派原则

    Java一个类的加载过程: 1.加载 a.jvm会根据类名找到对应的类文件 b.进行文件内容读取 2.链接 链接主要是验证类中数据是否合法,然后把刚加载进来的类和其他类的关系建立清楚,主要有以下几个步 ...

  9. 卸载java_Java面试必备——类的加载过程

    类的加载过程,类加载过程主要包含加载.验证.准备.解析.初始化.使用.卸载七个方面,下面一一阐述. 一.加载 在加载阶段,虚拟机主要完成三件事: 1.通过一个类的全限定名来获取定义此类的二进制字节流. ...

最新文章

  1. sql server 2014预览版发布
  2. sql建表,建索引注意事项
  3. 第五章5.1 strace
  4. JAVA.IO字符流
  5. 互联网协议套件(TCP/IP)及七层OSI模型
  6. jvm(2)-JVM内存的设置(解决eclipse下out of memory问题)
  7. python傅里叶逆变换_OpenCV-Python系列之傅里叶变换
  8. 1_Excel实战_自动录入另一个表格对应的数据
  9. 怎么把geany变成英文_细数Word中英文排版6大坑,我不相信你一个也没有遇到过...
  10. linux 编译,链接和加载
  11. android wifi列表轮询,(八十八)Android O WiFi启动流程梳理续——connectToSupplicant
  12. c语言中dot作用,编程小组功能介绍及使用说明
  13. 秋招春招总结,经验分享(计算机专业)
  14. 2021年全国程序员工资出炉想要年薪60万,难吗?网友,扎心了
  15. 什么叫大数据人物画像_【说大数据】人物画像 :大数据时代的心灵捕手
  16. android蓝牙a2dp切换歌曲广播,Android蓝牙A2DP连接实现
  17. DUL Oracle Data Unloader工具下载
  18. C语言 static 声明静态变量?大佬原来用它干这事!
  19. STC8通过SPI读写W25Q128
  20. 计蒜客第七章:互粉攻略

热门文章

  1. Linux定时任务系统 Cron
  2. android实现翻书效果(文本和图片的翻书)
  3. pytorch---nn.moduleList 和Sequential
  4. 1.6 logistic回归的keras实现
  5. word拼写检查自定义词典下载_取消或开启Word拼写检查和语法(去掉红波浪线)...
  6. java中加载窗口的函数_Java函数调用 - playgame的个人页面 - OSCHINA - 中文开源技术交流社区...
  7. 新建oracle数据库 环境查询,Oracle单实例数据库迁移到Oracle RAC 环境之(2)--实施篇...
  8. Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解
  9. java 深入io_Java高级编程-IO操作深入
  10. nodejs导出导入_NodeJS导出和导入模块