JVM类加载与双亲委派机制

类加载与字节码技术

源代码编译为字节码,经过类加载器把字节码加载到虚拟机中就可以执行字节码指令了,由执行引擎的解释器解释执行,在解释的过程中,会对热点代码进行运行期的编译处理,java虚拟机解释加编译,运行期优化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oKF3ZfJJ-1653460952939)(C:\Users\张修\Desktop\相册\QQ截图20220511151517.png)]

类文件结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6OOKXaxD-1653460952942)(C:\Users\张修\Desktop\相册\QQ截图20220511155515.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9AGsmDa-1653460952946)(C:\Users\张修\Desktop\相册\QQ截图20220511155641.png)]

魔数

0到3字节,表示它是否是[class]文件

ca fe ba be

版本

4到7字节,表示类的版本00 34 (52) 表示是java8

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6qvVdK2S-1653460952947)(C:\Users\张修\Desktop\相册\QQ截图20220511155947.png)]

常量池

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnElUwbZ-1653460952948)(C:\Users\张修\Desktop\相册\QQ截图20220511160558.png)]

字节码指令

自己分析类文件结构太麻烦,Oracle提供了javap工具反编译class文件

编译期处理(语法糖)

语法糖其实就是指java编译器把java源码编译为class字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担

默认构造器(生成默认无参构造器)

自动拆装箱

泛型擦除

可变参数(会根据传入参数个数创建大小一致的数组)

foreach循环

switch String

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ia03vAG-1653460952950)(C:\Users\张修\Desktop\相册\QQ截图20220511172931.png)]

这里也使用了hashcode()与equals()

switch enum

枚举类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hoWJ4vkc-1653460952950)(C:\Users\张修\Desktop\相册\QQ截图20220511173703.png)]

方法重写时的桥接方法

子类返回值可以是父类返回值的子类

jvm会生成一个父类返回值类型的方法,间接调用子类重写的方法,向上转型

桥接方法仅对jvm虚拟机可见

匿名内部类

类加载阶段

加载

将类的字节码载入方法区中,内部采用c++的instanceKlass描述java类,重要filed有:

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGazMpVi-1653460952951)(C:\Users\张修\Desktop\相册\QQ截图20220515160234.png)]](https://img-blog.csdnimg.cn/9b2a20a022b547099fb875bfecda41da.png

每个实例对象都有对象头,实例对象头16个字节,其中八个字节对应它的class地址,获取class信息通过访问对象头,通过地址找到mirror,通过类对象去元空间找

链接

验证:验证类是否符合JVM规范,安全性检查,阻止不合法类继续运行

准备:为static变量分配空间,设置默认值,好比有一个整型的静态变量,就会分配四个字节,并且将初始值填充为0

jdk6以前静态变量放在方法区中 1.7 1.8开始与类对象都存储在堆中了

static变量分配空间和赋值是两个步骤,分配空间在准备阶段完成,赋值在初始化阶段完成

如果static变量是final的基本类型,以及字符串常量(可以确定不变的),那么编译阶段值就确定了,赋值在准备阶段完成

如果static变量是final的,但属于引用类型,那么赋值也会在初始化阶段完成

解析:将常量池中的符号引用解析为直接引用

初始化

初始化即调用()v方法,虚拟机会保证这个类的构造方法的线程安全

发生时机

类初始化是懒惰的

main方法所在的类,总会被首先初始化

首次访问这个类的静态变量或静态方法时

子类初始化,如果父类还没初始化,会引发子父类的初始化

子类访问父类的静态变量,只会触发父类的初始化

Class.forName

new会导致初始化

不会导致类初始化的情况

访问类的static final静态常量(基本类型和字符串)不会触发初始化

类对象class不会触发初始化

创建该类的数组不会触发初始化

类加载器的loadclass方法

Class.forName的参数2为false时

类加载器

启动类加载器

扩展类加载器

应用程序类加载器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RooJWRmC-1653460952953)(C:\Users\张修\Desktop\相册\QQ截图20220516130508.png)]

四个层级的类加载器,各司其职,加载各指定位置的类

层级关系:在低层级比如应用程序类加载器会看它的类是否由它的上级(这里指扩展类加载器)已经加载过了,如果没有会委托它的上级(这里指扩展类加载器)再委托上上级(启动类加载器)看看有没有加载这个类,没有加载于是从上往下检查自己加载的包下有没有,有就加载,没有就让子加载器加载,如果两个上级都没有加载,才轮到应用程序类加载器去加载这个类(双亲委派的类加载模式)

从下往上再从上往下

第一遍只是检查有没有加载,第二遍是检查自己加载的包下有没有,有就加载,没有就让子加载器加载

双亲委派模式

就是指调用类加载器的loadClass方法时,查找类的规则

这里的双亲,翻译为上级更合适,因为它们并没有继承关系

上级是类启动加载器时为null,因为类启动加载器为c++写,不可见

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jsYSoosG-1653460952954)(C:\Users\张修\Desktop\相册\QQ截图20220516161444.png)]

线程上下文类加载器

线程上下文类加载器是当前线程使用的类加载器,默认就是应用程序类加载器,它内部是由Class.forName调用了线程上下文类加载器完成类加载

SPI机制是jdk提供接口,第三方jar包实现,接口由启动类加载器加载,实现类不在jdk中,需要反向委派,由线程上下文加载器加载

mysql的jdk打破了双亲委派模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wzM5jHBL-1653460952955)(C:\Users\张修\Desktop\相册\QQ截图20220516170035.png)]

采用应用程序类加载器加载

自定义类加载器

运行期优化

逃逸分析

解释执行和编译执行的区别

解释执行:解释执行是采用匹配执行解释器(解释器是个黑盒,通常也有编译器的组成部分)内部已经编译好的机器码,不是生成新的机器码(也有说法是逐条翻译成机器码?)。 - 由于逐条翻译,程序启动快,但是执行效率不高。
编译执行:运行期间,通过将字节码编译成对应的新的机器码(会将其缓存起来,通过参数-XX:ReservedCodeCacheSize),然后执行。 - 需要先编译出新的机器指令,所以程序启动较慢,但是执行效率高(因为执行的是机器指令)。

分层编译(JIT)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yNpb7oom-1653460952956)(C:\Users\张修\Desktop\相册\QQ截图20220516183407.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z5Q6fYOS-1653460952956)(C:\Users\张修\Desktop\相册\QQ截图20220516185851.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-giCnqCgY-1653460952958)(C:\Users\张修\Desktop\相册\QQ截图20220525105109.png)]

new object()外面没有用到干脆就没有创建

该优化手段称之为逃逸分析,发现新建的对象是否逃逸

方法内联

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PnJQl0VN-1653460952959)(C:\Users\张修\Desktop\相册\QQ截图20220516194538.png)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

outlier--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值