11.执行引擎

一、执行引擎概述

			对 加载到 运行时数据区的 字节码文件 ,解释执行,编译成让操作系统认识的机器指令;
			执行引擎会根据PC寄存器的值,进行执行

二、java代码编译和执行过程

......

2.1、什么是解释器?

答:当java 虚拟机器启动时,会根据预定的规范对字节码采用逐行解释的方式执行,将每条字节码文件当中的内容 “翻译” 成对应的机器指令,解释执行

2.2、什么是JIT即时编译器?(热点代码(热点勘测技术))

答:就是虚拟机将(热点代码)源代码直接编译成和本地机器平台相关的指令(机器指令),并且缓存起来,下次再调用的时候,就直接调用机器指令了,也不需要解释器解释了,效率更高了

2.3、为什么说java是,半解释型,半编译型 语言

答:既可以 使用 解释器 解释执行,又可以 使用jit 编译执行

2.4、总结如图

三、机器码、指令、汇编语言

见百度...

四、解释器(响应速度快)

		解释器:真正意义上所承担的角色就是 一个 翻译官,将字节码文件中的内容 翻译 
		为 对应平台的 机器指令
		当一个条字节码指令被解释执行后,接着再根据PC寄存器的值执行下一条执行

五、JIT即时编译器(先翻译机器指令后快)

....

六、HotSpot VM

6.1、热点代码勘测 何时jit?

	根据代码执行的频率来定,执行频率比较高的代码 被称为 “热点代码”
	JIT编译器在运行当中会针对 哪些 频率很高的 “热点代码”  做出深度优化,从而提升性能
	AOT(静态提前编译器)编译器在运行之前会针对 哪些 频率很高的 “热点代码”  做出深度优化,从而提升性能

6.2、热点代码

	一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体也被称为“热点代码”,
	因此都可以通过JIT编译为本地机器指令,由于编译方式在方法的执行过程中,因此被称为
	“栈上替换”或者简称“OSR编译” 
那么多少次是多呢?依靠热点探测功能
	hotspotVM 是基于计数器的的热点勘测技术,
	计数器:方法调用机器数 和 和回边计数器(循环体次数)
		方法调用计数器:Client 是 1500次,Server 是10000,超过这个阈值就会触发JIT
							可以通过虚拟机参数:-XX:CompileThreshould 来人为设置
		回边计数器:也有计数器,它的作用是统计一个方法中循环体代码的执行次数,在字节码
						遇到控制流向后跳转的指令称之为(回边),显然,建立回边计数器统计的目的就是为了触发OSR编译,栈上替换

七、总结

一般来讲,JIT编译器编译出来的机器码性能比解释器高

C2编译器启动时长比C1编译器慢,系统稳定执行以后,C2执行速度快于 C1

C1(Client) C2(Server)

AOT与JIT ,前者在之前勘测,后者在运行当中勘测热点代码

posted @ 2021-07-08 16:08  宋佳强  阅读(69)  评论(0)    收藏  举报