hllvm.JIT编译以及执行native code的流程1
Java虚拟机(JVM)中的Just-In-Time (JIT)编译是提高性能的关键技术之一。JIT编译器能够将字节码转换成本地机器代码,以便更快地执行。这里我们将详细探讨JIT编译以及执行本地代码的流程,特别关注标题和描述中提到的点。 1. JIT生成本地代码的流程: 当Java应用程序运行时,JVM首先使用解释器执行字节码。解释器逐行解释并执行字节码指令。然而,如果一个方法被频繁调用,JIT编译器会被触发来编译这个方法为本地代码。HotSpot JVM有两个主要的JIT编译器:Client Compiler (C1) 和 Server Compiler (C2)。 - C1 编译器通常用于轻量级客户端应用,它快速生成本地代码,但优化程度较低。 - C2 编译器则用于服务器端应用,它会进行更深度的优化,但编译时间较长。 编译过程通常由以下步骤组成: - 方法被选择进行JIT编译,基于调用次数、时间消耗等指标。 - 编译器开始解析字节码,并生成中间表示(IR)。 - IR经过一系列优化,例如死代码消除、常量折叠、循环展开等。 - 最终,优化后的IR被转换为本地机器代码,并存储为nmethod对象。 2. VM执行JIT编译好的本地代码的流程: 当JIT编译完成后,VM会使用这些本地代码来替代原来的字节码执行。在HotSpot中,`call_helper`函数是调用Java方法的通用入口点,无论是解释执行还是编译执行。 - `call_helper`函数首先检查方法是否已经JIT编译。如果尚未编译,`CompilationPolicy::must_be_compiled`会判断是否需要立即编译。如果是,`CompileBroker::compile_method`会被调用来启动编译过程。 - 编译完成后,编译后的本地代码地址被保存在nmethod对象中。下次调用该方法时,VM会跳过解释器,直接通过nmethod的入口点执行本地代码。 - 在`call_stub`中,`StubRoutines::call_stub()`是一个平台相关的调用约定,用于调用生成的本地代码。 在描述中提到的`compile_method`方法内部的打印语句未被执行,可能是因为编译是异步进行的,而且可能由于编译阈值未达到,或者由于其他编译策略的原因而没有触发。此外,调试输出可能需要开启特定的日志选项。 JIT编译和执行本地代码的过程涉及对字节码的实时分析、优化和转换,以及在运行时动态切换执行路径。这是一个复杂的系统,旨在平衡启动速度、内存占用和运行时性能。深入理解这个过程对于优化Java应用性能至关重要。



剩余16页未读,继续阅读


















- 粉丝: 30
- 资源: 326
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- (源码)基于C语言的F2FS文件系统工具集_1.zip
- (源码)基于Arduino平台和Pololu DVR8825驱动板的步进电机控制器驱动(SMCD)_2.zip
- (源码)基于Arduino平台和Pololu DVR8825驱动板的步进电机控制器驱动(SMCD)_1.zip
- (源码)基于Arduino和Raspberry Pi的风扇控制系统_2.zip
- 通过复杂的文本对齐和运动感知一致性进行内容丰富的AIGC视频质量评估
- ArubaInstant-Draco-8.3.0.16-79990
- 基于超表面全息成像技术的超透镜GS算法研究与应用,超表面全息成像技术:超透镜gs算法驱动的革命性突破,超表面全息成像超透镜gs算法 ,超表面全息成像; 超透镜; GS算法,超表面全息成像与超透镜gs算
- LVGL8.1和LVGL9.3移植到T113成功的代码
- java-springboot+vue基于数据挖掘技术的线上招聘信息分析系统-说明文档-演示视频.zip
- ArubaInstant-Hercules-8.3.0.16-79990
- 基于Comsol超表面技术的折射率传感器研究:电磁诱导透明EIT与BIC的典型应用分析,超表面折射率传感器技术与电磁诱导透明EIT及连续体中束缚态BIC的物理探索,Comsol超表面折射率传感器 电
- ArubaInstant-Lupus-8.3.0.16-79990
- AXML 代码生成器,AXML 代码生成器
- (源码)基于Arduino的空气质量监测系统_1.zip
- (源码)基于Arduino的空气质量监测系统_2.zip
- (源码)基于C++的控制流图解析器_1.zip



评论0