jvm类的生命周期和双亲委派模型

类的生命周期分为5步:
类的加载 -> 连接 -> 初始化 -> 使用 -> 销毁

一、加载(load)
主要分为俩步:1、读取二进制流,并将二进制流转化为特定的数据结构
2、初步校验cafe babe魔法值、常量池、文件长度、是否有父类等,然后生成java.lang.class实例。

二、连接(link)
主要分为三步:校验,准备,解析
校验:校验class文件的信息是否符合jvm规范,比如final是否合规,类型是否正确,静态变量是否合理等
准备:为类的静态变量分配内存,并初始化默认值
解析:解析是将常量池中的符号引用转化为直接引用的过程(主要针对类或接口、字段、类方法、接口方法四类符号引用解析)

三、初始化(init)
初始化就是执行类的构造器的过程,有五种方法可以完成类的初始化:1、用new方法,2、利用反射(Class类的newInstance方法和Constructor的newInstance方法),3、克隆(Clone),4、使用反序列化机制
小知识点:new和newInstance的区别:
new是强校验类型,可以使用任何构造方法。而Class类的newInstance是弱校验类型,只能使用无参构造方法,当没有默认构造方法时就抛InstantiationException异常,如果此方法没有权限访问,会抛 IllegalAccessException异常

四、使用
完成类的初始化之后,就可以对类进行实例化,在程序中使用了

五、销毁
当代表类的class对象不被引用时,类的对象就会结束生命周期,被销毁调

面试考点
说说什么是双亲委派模型
在这里插入图片描述
加载过程中生产java.lang.class是通过类的加载器去实现的,那类加载器是如何定位到具体的类文件并读取的呢?
类的加载过程就叫双亲委派模型
java的类记载器主要分为三类,并且有严格的等级制度,上下级关系
最高一级是bootstrap类加载器:它是在 JVM 启动时创建的 通常由与操作系统相关的本地代码实现, 是最根基的类加载器,主要加载最核心的java类,jdk安装bin目录下的jar,还可以加载jvm配置的- Xbootclasspath/ 参数下路径的类
第二级是platform(jdk9以前是extension)加载器,主要负责加载jdk安装ext目录下的jar
第三级是application加载器,主要加载用户定于的classpath路劲下面的类
接下来就是一些自定义的类加载器。

这么多加载器这么工作的呢?
低层次的当前类加载器,不能覆盖更高层次类加载器已经加载的类。如果低层次 的类加载器想加载 个未知类,要非常礼貌地向上逐级询问 :“ 请问,这个类已经加 载了吗? 被询问的高层次类加载器会自问两个问题,第一,我是否已加载过此类? 第二,如果没有,是否可以加载此类?只有当所有高层次类加载器在两个问题上的答 案均为“否”时,才可以让当前类加载器加载这个未知类。这就是双亲委派模型,我叫它败家子模式,就是不管是么问题,我都丢给我的父亲去解决,父亲解决不了,在自己解决。

注:读《码出高效:Java开发手册》整理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值