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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值