JVM -1 整体结构与类加载子系统

JVM整体结构

在这里插入图片描述

Java代码执行流程

在这里插入图片描述

计算机系统指令集分为栈的指令集和寄存器的指令集。

JVM是采用栈的指令集,其与硬件耦合度小,指令集小,指令多。性能逊于寄存器指令集

JVM生命周期

1、虚拟机的启动

​ 虚拟机的启动是通过类加载器创建一个初始类实现的

2、虚拟机的执行

3、虚拟机的退出

​ 程序正常结束

​ 程序执行出现异常或错误

​ 操作系统错误导致虚拟机出现错误

类加载子系统

在这里插入图片描述

类记载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。

Class Loader只负责class文件的加载,至于是否可以运行由Execution Engine决定。

类加载器的三个阶段

加载阶段

1、通过类的全限定类名获取此类的二进制流

2、将字节流所代表的静态存储结构转化为方法区的运行时数据结构

3、在内存区生成一个代表这个类的 java.lang.Class对象,作为方法区这个类的各种数据的访问入口

链接阶段

1、验证

​ 确保class文件的字节流信息符合虚拟机要求,保证被加载类的正确性

2、准备

​ 为变量分配内存,并且设置该变量的默认初始值

​ 这里不包含用final修饰的static,因为final在编译时就分配了

3、解析

初始化阶段

初始化阶段就是执行类构造器的方法,比如静态代码块的赋值、类构造类方法。

类加载器分类

JVM支持两种类型加载器,分别为引导类加载器,和自定义类加载器。

引导类加载器

​ 系统mo

自定义类加载器

​ 使用自定义类加载器场景

1、隔离加载类

2、修改类的加载方式

3、扩展加载源

4、防止源码泄露

双亲委派机制

工作原理

1、如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行

2、如果父类加载器还存在父类加载器,则进一步向上委托,一次递归,直到最顶层的加载器。

3、如果父类加载器成功加载,则返回成功。若加载失败,则让子类加载。一次递归,直到加载成功。

4、加载第三方jar包时,引导类加载器加载接口后,通过反向委托使用系统类加载器加载接口的实现类。

沙箱安全机制

如自定义String类,但是在加载自定义String类的时候会率先使用引导类加载器加载,而应到类加载器会首先加载JDK中自带的文件报错信息 为 :没有main方法,与双亲委派机制同理

其他

在JVM中表示两个class对象是否为同一个类 ,有两个必要条件

1、类的完整类名必须一致

2、加载这个类的classLoader必须一致

类的主动使用和被动使用

主动使用和被动使用区别

被动使用并不会导致类的初始化

主动使用的情况

​ 1、创建类的实例

​ 2、访问某个类或接口的静态变量,或者对该静态遍历赋值

​ 3、调用类的静态方法

​ 4、反射

​ 5、初始化一个类的子类

​ 6、Java虚拟机启动时被表明启动类的类

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值