JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载,如图:

没错,以上就是抽象的类加载过程,写类加载过程的都是大同小异,图我也是copy来的,然后联想到近期刚刚入职新公司,下面我入职新公司来解释类加载(绝对通俗易懂):

加载(加载是指查找字节流并据此创建类的过程,说白了,就是把编译后的.Class静态文件转换到内存中(方法区),然后暴露出来让程序员能访问到)

场景:企业A发offer,约定6月17号入职,为我分配了部门,入档,部门领导人在周例会汇报中报备部门成员XXX(待入职)

(1) 找:通过一个类的全限定名来获取此类的class字节码二进制流。(给一个名称找到class字节码文件=通过面试邮箱发offer)

(2) 转:将这个字节码二进制流中的静态存储结构转化为方法区中的运行时数据结构。(转化为线程共享内存方法区的运行时数据结构=???这个不好解释)

(3) 存:在内存中生成一个代表该类的java.lang.Class对象,作为方法区中这个类的各种数据的访问入口。(在方法区中为类实例化一个源对象,目的是作为方法区这个类的各种数据的访问入口=企业A为我分配部门,入档,领导内部沟通时可以用XXX部门的XXX人员)

注: 1.在JVM中类的唯一性是由类的全名和类加载器确定的,相同的class文件被不同的类加载器加载生成的两个类是不同的。 2.加载阶段和连接阶段的部分内容是交叉进行的,加载阶段尚未结束,连接阶段可能就已经开始了。 3.源对象只会存放静态资源,如static变量

连接(将java类的二进制代码合并到JVM的运行状态之中的过程)

场景:6.17号,本人入职递交材料,如体检/上家企业的离职报告,hr领我到对应工位,并提供企业文化和流程等相关文档文件,并在座位上配备人员信息(其实就是一张卡片,职位姓名之类的信息),目的让其他人可以看见

验证:确保加载的类信息符合JVM规范,没有安全方面的问题 (对实例化对象进行各种校验,比如语法/符号 = hr检查材料是否交齐,并有没有作假)

准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配 (在源对象的基础上为static变量开辟空间并设置初始值=hr领我到工位,作为我的办公区)

解析:虚拟机常量池的符号引用替换为字节引用过程 (将抽象的指令转换为具体的地址指令=配备信息卡片,当其他找我时,只需要看到卡片上的名字就可以了)

注: 1.public static Integer value=1;在准备阶段的值其实是为0的。需要注意的是常量是在准备阶段赋值的:public static final Integer value =1 ;在准备阶段value就被赋值为了1;

2.解析的过程:比如在类A中调用了B的方法;大家想一想,我们编译完成.class文件后其实这种对应关系还是存在的,只是以字节码指令的形式存在,比如 "invokespecial #2"大家可以猜到#2其实就是我们的类B了,那么在执行这一行代码的时候,JVM咋知道#2对应的指令在哪,这就是一个静态的家伙,假如类B已经加载到方法区了,地址为(#f00123),所以这个时候就要把这个#2转成这个地址(#f00123),这样JVM在执行到这里时就知道B类在哪了,就可以去调用了。甚至Java 虚拟机为每个类都准备了一张方法表来存放类中所有的方法。当需要调用一个类的方法的时候,只要知道这个方法在方法表中的偏移量就可以直接调用该方法了

初始化(调用类的构造方法,为类的静态变量赋予正确的初始值,注意是类的构造方法,不是实例构造函数,实例构造函数就是我们通常写的构造方法,类的构造方法是自动生成的)

场景:入职之后,在之前入档的基础上初始化个人信息和各种账号,如邮箱,域账号域密码等

注:1.前面的类加载过程中,除了加载(Loading)阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制。

2.一个类何时被初始化可以分为以下几类:A:创建类的实例(new)。B:访问某个类或接口的静态变量,或者对该静态变量赋值。C:调用类的静态方法。D:通过反射方式执行以上三种行为。E:初始化子类的时候,会触发父类的初始化。F:Java虚拟机启动时被标明为启动类的类。(有main方法的类)

3.初始化完成以后,类被存放在方法区,注意哦,此时并没有存放在堆内存中。只有当对象实例化进入堆内存中以后才会对非静态变量进行初始化赋值。

使用和卸载

场景:有账号密码了,可以工作了,直到下次离职,开始工作啦。。。。。。。

1.使用:直接new或者通过反射.newInstance,堆内存创建实例化对象.(等同于开始工作了,领导安排任务)

2.卸载:卸载是自动进行的,也就是GC,gc在方法区也会进行回收.不过条件很苛刻,感兴趣可以自己看一看,一般都不会卸载类.(下次离职。。。。?)

转载于:https://juejin.im/post/5d3adfebf265da1bb776b11d

类的加载过程(来一个通俗易懂的理解)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. JVM——类的加载过程

    附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...

  10. 类的加载过程详解:加载、验证、准备、解析、初始化

    想要弄明白的知识点: 类加载的过程,加载.验证.准备.解析.初始化.每个部分详细描述. 加载阶段读入.class文件,class文件时二进制吗,为什么需要使用二进制的方式? 验证过程是防止什么问题?验 ...

最新文章

  1. 一套基于 SpringBoot 的完整高并发电商系统,拿去面试简直不要太好用!
  2. hp compaq presarop v3009笔记本重新启动蓝屏!
  3. python爬取慕课视频-python爬虫:爬取网站视频
  4. JAVA API1.7中文手册
  5. git粘贴命令行_如何使用git检测复制和粘贴代码?
  6. 想要成为真正优秀的程序员是不是真的很难?
  7. Excel2013的PowerView报表
  8. C语言的32个关键字怎么背,C语言32个关键字,精心整理带中文翻译
  9. 推荐几款常用的Socks5代理软件
  10. 硬核AI开发者大会来袭:飞桨发布开源框架2.0 RC版、生物计算平台PaddleHelix「螺旋桨」...
  11. unity内部图集切割
  12. SV学习(8)——随机约束和分布、约束块控制
  13. 无为WiFi正在被DD
  14. 为激情为生---“激情团队宣言”
  15. python常见算法(chatgpt算法实现)
  16. 2021-2027全球与中国厨房用食品搅拌机市场现状及未来发展趋势
  17. Tableau工具提示:显示图表
  18. 39.超市微信促销活动5
  19. caxa二次开发实例展示
  20. 如何高效骑驴找马?在职跳槽需要注意的都在这里

热门文章

  1. java关于替换文本输出的讲解_java替换文件中某一行文本的内容
  2. 自动驾驶数据集_奥迪推出大型自动驾驶数据集A2D2
  3. python定义字典对象时_Python对象类型之字典
  4. python快速开发框架_GitHub - lee2029/pyui4win: 一个用python实现业务逻辑、用xml和html/css/js描述界面的windows程序的快速开发框架...
  5. 聊题“谈、闲、想、省”
  6. OpenCV-Python实战(10)——详解 OpenCV 轮廓检测
  7. 我的世界自己服务器显示坐标,如何让我的世界一直显示坐标 | 手游网游页游攻略大全...
  8. xsd 生成 java 类_如何从Java类生成XSD
  9. echo linux命令_Linux echo命令示例
  10. java中接口私有反方_接口中的Java 9私有方法