JVM之执行引擎第一篇(总体的第十篇)

一、回顾之前

1、之前的学习

在前面的笔记记录中,已经学习完了前面的类加载子系统,运行时数据区,有不知道的朋友可以点我主页参考响应文章,接下来我就要进行java虚拟机的下面一部分了,执行引擎。

2、复习一下java虚拟机

、 我们都是知道是我们编写的代码是不能直接执行的,并且XXX.java在前端编译后得了我们的XXX.class的字节文件,这个过程叫做前端编译。而我们的执行引擎是要把字节码翻译为机器语言的一个翻译官的能力,也就是把你前端编译器翻译的XXX.java得到的XXX.class文件,然后执行引擎()将XXX.class文件进行处理翻译为机器指令。 那我们就正式开始学习执行引擎。

二、执行引擎

1、执行引擎概述

    它是一个翻译官的介质。

2、java代码编译和执行的过程

(1)大多数编程语言的过程

大多数的代码执行过程都是如下图所示。

    最上面一条橙色的路线可以理解为javac的执行,就获得了我们的XXX.class的文件了,这个文件里面就存储一个线性的一条过程。【也就是前端编译器的执行的一条过程】 中间一条绿色的线表示的就是我们有些代码是边编译边执行的一条过程。【逐行翻译逐行执行的过程】 最下面的就是把整个文件先翻译再执行的过程。 以上三个颜色的过程中,我们虚拟机只要考虑两个过程就是下面的绿色和蓝色的两过程。前面的过程是javac执行获得的。

(2)java语言的执行过程

    为什么说java是半解释半编译型的语言? 答案是因为是我们的java既可以选择自己选择,既可以选解释型的执行,也可以即时编译型的执行方式。

3、机器码_指令_汇编_高级语言

    机器码 指令和指令集 汇编语言 汇编语言是不能直接被执行的,必须要翻译为指令。 高级语言(比如C,C++,Java,go) 记得如下的一个过程 那我们的字节码到底相当于什么的一个东西呢? 它这种中间状态就很好的实现跨平台性。

4、解释器的使用

(1)问题引入

    有一个疑问:就我们的高级代码可以直接使用执行引擎来转换为我们的指令,直接执行,这样可以吗?同样都实现了跨平台性。 其实上面问题原因是如下:效率

(2)解释器分类

(3)解释器的一种现状

5、JIT(Just in Time)编译器的使用

java是两种并存的,解释器和JIT编译器【它是把一个方法都是直接翻译为机器码,然后来进行执行,它的速度比较快的】。在不同的时候,是要选择不同的方式。【复习一下:像JRockit是没有解释器的,Hotspot和J9都是并存的】

    一个问题 那我们既然都有非常高的性能的JIT,那为什么还要有解释器呢? 原因是:解释器它是直接把字节码拿来开始执行,响应时间快,得到执行的时间比较长。而我们的JIT编译器则是先翻译,它翻译后,它的执行性能是比价快的,所以我们是要保留下来。

6、JIT编译器的细节

编译器的概念

(1)热点代码及探测方式

    方法调用计数器 JIT后的代码得到后,它是缓存起来在我们的元空间(方法区),它是直接保存在本地内存里面了。 热度衰减 回边计数器

(2)Hotspot设置模式

    在命令行设置的方式 可以设置混合的模式 在我们的Idea里面设置 Xint:它是设置纯解释的形式 Xcomp:纯编译的形式 Xminxed:混合使用的模式【它是默认情况的使用】

(3)HotspotVM的JIT分类C1和C2

    c1和c2编译器不同的优化策略 c2只能在server模式下才可以使用的。但是有不是只有在server下才可以使用c2的模式,也有如下方式 总结一下

7、Graal编译器和AOT编译器

    Graal 如果看过我之前文章的朋友可能知道之前也讲到了Graal虚拟机的,这里就不细讲解了。 AOT编译器
经验分享 程序员 微信小程序 职场和发展