首页 > 其他分享 >14 HotSpot将字节码变为机器码的过程

14 HotSpot将字节码变为机器码的过程

时间:2022-12-13 00:12:21浏览次数:74  
标签:解释器 14 虚拟机 HotSpot 机器码 编译 编译器 执行

目录
特别说明:

  1. 本章内容基于HotSpot虚拟机

    1. 编译器是指HotSpot内置的即时编译器
    2. 虚拟机是指HotSpot
  2. 机器码:能够被被当前机器直接执行的代码,机器归属一个平台,不同的平台有:SPARC、x86-AMD64、ARMv8-AArch64

1 广义理解:解释执行与编译执行

阅读原文2天,我仍然没理解 什么是解释执行,跟编译执行有什么不同。我尝试从书籍原文和行业规范等方向去查找资料,可是效果不佳。无奈,只能找一篇看起来还算正规的文章,以不思考通篇接受的方式,来帮助自己理解解释执行。这小节内容整理自:3分钟搞懂什么是编译执行和解释执行

1 HotSpot虚拟机基本介绍

  1. 它是Sun/OracleJDK和OpenJDK中的默认Java虚拟机,也是目前使用范围最广的Java虚拟机,首次被应用在JDK 1.3;
  2. 内置有编译器和执行器,采用解释器与编译器并存的运行架构
  3. 对比其他虚拟机,核心技术有:热点代码探测技术

1 为何HotSpot虚拟机要使用解释器与即时编译器并存的架构?

  1. HotSpot执行字节码有三种方式:

    1. 解释执行:解释器逐条执行字节码指令,或者轻度优化字节码后再执行
    2. 编译执行:即时编译器先对字节码指令流深度优化,编译成机器码后再执行。
    3. 混合模式:解释器和编译器协同执行
  2. 解释器和编译器如何协同工作:

    1. 程序启动时,先启用解释器,省去编译的时间,立即运行。
    2. 程序启动后,启用编译器,把越来越多的代码编译成本地代码,这就减少解释器的中间损耗,获得更高的执行效率。
    3. 如果编译器优化失败,还能退回解释器执行【这叫逆优化】
  3. 协同目的:

兼顾程序响应时间与最佳执行性能,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更复杂的代码优化技术,输出质量更高的本地代码。

2 为何HotSpot虚拟机要实现两个(或三个)不同的即时编译器?

  1. 内置了三个即时编译器:

    1. 2个传统的:客户端编译器(C1)、服务端编译器(C2),
    2. 1个JDK10出现的:Graal编译器(长期目标是代替C2)
  2. 解释器搭配一个编译器来工作:

    1. 默认:HotSpot根据自身版本与宿主机的硬件性能自动选择编译器
    2. 指定:使用 -client-server参数来指定编译器
  3. 目的:因为不同的编译器,优化的深度不一样,用户可以根据程序特点来选择

3 程序何时使用解释器执行?何时使用编译器执行?

  1. HotSpot工作模式:

    1. 默认采用混合模式
    2. -Xint强制使用解释模式:编译器不工作,全部指令都使用解释方式执行
    3. -Xcomp强制使用编译模式,优先采用编译方式执行程序,但是解释器仍然要在编译无法进行的情况下介入执行过程
    4. 不同参数运行结果:
  2. 引入分层编译原因:

    1. 即时编译器越优化,耗时越长
    2. 编译器优化时,解释器要替编译器收集性能监控信息,影响解释执行阶段的速度
    3. 兼顾程序启动响应速度与运行效率之间达到最佳平衡,引入分层编译
  3. 分层编译层次:
    1.

4 哪些程序代码会被编译为本地代码?如何编译本地代码?

热点代码

  • 被多次调用的方法
  • 被多次执行的循环体

一、客户端编译器的编译过程:

二、服务端编译器的编译过程:

比客户端模式进行更深入的优化

编译工作总结:

  1. 将字节码翻译为机器码 【基本、简单的需求】
  2. 代码优化【核心、关键的需求】

5 如何从外部观察到即时编译器的编译过程和编译结果?

算了吧,既然平时无法感知到,就没必要观察其过程,太复杂。

标签:解释器,14,虚拟机,HotSpot,机器码,编译,编译器,执行
From: https://www.cnblogs.com/knowledgeispower/p/16977503.html

相关文章