目录
- 1 广义理解:解释执行与编译执行
- 1 HotSpot虚拟机基本介绍
- 1 为何HotSpot虚拟机要使用解释器与即时编译器并存的架构?
- 2 为何HotSpot虚拟机要实现两个(或三个)不同的即时编译器?
- 3 程序何时使用解释器执行?何时使用编译器执行?
- 4 哪些程序代码会被编译为本地代码?如何编译本地代码?
- 5 如何从外部观察到即时编译器的编译过程和编译结果?
特别说明:
-
本章内容基于HotSpot虚拟机:
- 编译器是指HotSpot内置的即时编译器
- 虚拟机是指HotSpot
-
机器码:能够被被当前机器直接执行的代码,机器归属一个平台,不同的平台有:SPARC、x86-AMD64、ARMv8-AArch64
1 广义理解:解释执行与编译执行
阅读原文2天,我仍然没理解 什么是解释执行,跟编译执行有什么不同。我尝试从书籍原文和行业规范等方向去查找资料,可是效果不佳。无奈,只能找一篇看起来还算正规的文章,以不思考通篇接受的方式,来帮助自己理解解释执行。这小节内容整理自:3分钟搞懂什么是编译执行和解释执行
1 HotSpot虚拟机基本介绍
- 它是Sun/OracleJDK和OpenJDK中的默认Java虚拟机,也是目前使用范围最广的Java虚拟机,首次被应用在JDK 1.3;
- 内置有编译器和执行器,采用解释器与编译器并存的运行架构
- 对比其他虚拟机,核心技术有:热点代码探测技术
1 为何HotSpot虚拟机要使用解释器与即时编译器并存的架构?
-
HotSpot执行字节码有三种方式:
- 解释执行:解释器逐条执行字节码指令,或者轻度优化字节码后再执行
- 编译执行:即时编译器先对字节码指令流深度优化,编译成机器码后再执行。
- 混合模式:解释器和编译器协同执行
-
解释器和编译器如何协同工作:
- 程序启动时,先启用解释器,省去编译的时间,立即运行。
- 程序启动后,启用编译器,把越来越多的代码编译成本地代码,这就减少解释器的中间损耗,获得更高的执行效率。
- 如果编译器优化失败,还能退回解释器执行【这叫逆优化】
-
协同目的:
兼顾程序响应时间与最佳执行性能,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更复杂的代码优化技术,输出质量更高的本地代码。
2 为何HotSpot虚拟机要实现两个(或三个)不同的即时编译器?
-
内置了三个即时编译器:
- 2个传统的:客户端编译器(C1)、服务端编译器(C2),
- 1个JDK10出现的:Graal编译器(长期目标是代替C2)
-
解释器搭配一个编译器来工作:
- 默认:HotSpot根据自身版本与宿主机的硬件性能自动选择编译器
- 指定:使用 -client 或 -server参数来指定编译器
-
目的:因为不同的编译器,优化的深度不一样,用户可以根据程序特点来选择
3 程序何时使用解释器执行?何时使用编译器执行?
-
HotSpot工作模式:
- 默认采用混合模式
- 用 -Xint强制使用解释模式:编译器不工作,全部指令都使用解释方式执行
- 用 -Xcomp强制使用编译模式,优先采用编译方式执行程序,但是解释器仍然要在编译无法进行的情况下介入执行过程
- 不同参数运行结果:
-
引入分层编译原因:
- 即时编译器越优化,耗时越长
- 编译器优化时,解释器要替编译器收集性能监控信息,影响解释执行阶段的速度
- 兼顾程序启动响应速度与运行效率之间达到最佳平衡,引入分层编译
-
分层编译层次:
1.
4 哪些程序代码会被编译为本地代码?如何编译本地代码?
是热点代码:
- 被多次调用的方法
- 被多次执行的循环体
一、客户端编译器的编译过程:
二、服务端编译器的编译过程:
比客户端模式进行更深入的优化
编译工作总结:
- 将字节码翻译为机器码 【基本、简单的需求】
- 代码优化【核心、关键的需求】
5 如何从外部观察到即时编译器的编译过程和编译结果?
算了吧,既然平时无法感知到,就没必要观察其过程,太复杂。
标签:解释器,14,虚拟机,HotSpot,机器码,编译,编译器,执行 From: https://www.cnblogs.com/knowledgeispower/p/16977503.html