当前位置: 首页 > article >正文

【jvm】C1编译器

目录

          • 1. 说明
          • 2. 作用
          • 3. 特点
          • 4. 编译流程
          • 5. C1编译器与分层编译
          • 6. C1编译器的相关参数

1. 说明
  • 1.JVM(Java Virtual Machine)C1编译器是Java虚拟机中的一个即时编译器(Just-In-Time Compiler,JIT),也称为Client Compiler
2. 作用
  • 1.将Java字节码转换为本地机器代码,以提高程序的执行效率。
  • 2.在运行时,JVM会动态地将经常执行的字节码编译为本地机器代码,这个过程包括对代码进行优化,以提高执行速度。
3. 特点
  • 1.快速启动:C1编译器关注局部性优化,生成的代码速度较快,但优化程度相对较低。这使得C1编译器非常适合于执行时间较短或对启动性能有要求的程序,如GUI应用等。
  • 2.简单优化:C1编译器会对代码进行一些基本的优化,如条件表达式消除、基本块消除、全局值编号(GVN)优化、数组范围检查消除和NULL检查消除等。这些优化有助于减少代码的大小和提高执行效率。
  • 3.平台无关性:C1编译器生成的中间表示(IR)具有平台无关性,这使得优化过程更加方便。在优化完成后,C1编译器会将高级中间表示(HIR)转换为低级中间表示(LIR),然后基于LIR进行寄存器分配和机器代码生成。
4. 编译流程
  • 1.字节码解析生成HIR:C1编译器首先会解析Java字节码,并生成高级中间表示(HIR)。HIR是由基本块构成的控制流图,基本块内部是SSA(Static Single Assignment)形式的指令序列。
  • 2.HIR优化:在生成HIR后,C1编译器会对其进行一系列优化,如条件表达式消除、基本块消除、GVN优化、数组范围检查消除和NULL检查消除等。
  • 3.HIR生成LIR:优化完成后,C1编译器会将HIR转换为低级中间表示(LIR)。
  • 4.线性扫描寄存器分配:基于LIR,C1编译器会进行线性扫描寄存器分配,将虚拟寄存器映射到物理寄存器上。
  • 5.机器代码生成:最后,C1编译器会生成本地机器代码,并将其放入nmethod中,以便JVM直接执行。
5. C1编译器与分层编译
  • 1.在Java 7中,引入了分层编译(Tiered Compilation)的概念。
  • 2.分层编译综合了C1编译器的启动性能优势和C2编译器的峰值性能优势。
  • 3.分层编译将编译过程分为多个层次,每个层次都对应不同的优化级别。
  • 4.第1层到第3层都使用C1编译器进行编译,但优化级别逐渐提高。
  • 5.第4层则使用C2编译器进行编译,启用更多耗时较长的优化。
  • 6.通过分层编译,JVM可以根据程序的运行情况动态地选择合适的编译路径,以达到最佳的性能表现。
  • 7.例如,在程序启动阶段,JVM可能会选择使用C1编译器进行快速编译;而在程序运行稳定后,则可能会选择使用C2编译器进行更深入的优化。
6. C1编译器的相关参数
  • 1.JVM提供了多个参数来控制C1编译器的行为。
  • 2.-client:强制指定JVM使用C1编译器。
  • 3.-XX:+TieredCompilation:开启分层编译(JDK 8之后默认开启)。
  • 4.-XX:TieredStopAtLevel=N:将分层编译停留在第N层。例如,-XX:TieredStopAtLevel=3表示仅使用C1编译器进行编译,而不使用C2编译器。
  • 5.-XX:+PrintCompilation:输出应用代码的编译细节,方便进行性能调优。

http://www.kler.cn/a/421328.html

相关文章:

  • 动态规划-----路径问题
  • 第四十四篇 EfficientNetV1、V2模型详解
  • autogen-agentchat 0.4.0.dev8版本的安装
  • c++总复习
  • C/C++ 数据结构与算法【线性表】 顺序表+链表详细解析【日常学习,考研必备】带图+详细代码
  • 【C++boost::asio网络编程】有关异步读写api的笔记
  • NLP-语料库的相关知识整理
  • vue 项目准备
  • Figma入门-组件变体复习
  • Kafka 数据写入问题
  • linux安全-firewalld防火墙-基础讲解
  • Linux Find 命令详情解释
  • cf EC 172 C(0->-1 的转化+区间和使用前缀和表示,化简式子)+ D(二维的信息,先对一维排序,另一维看情况分析)
  • 时间同步服务器--Linux中
  • leetcode--螺旋矩阵
  • 《利用 Python 和 Pyecharts 对豆瓣电影数据可视化分析》
  • 「Java EE开发指南」如何在Java EE网站中使用CodeLive?
  • mysql-为什么需要线程池
  • 爬虫获取的数据如何确保准确性?
  • CAD 二次开发入门与实践:以 C# 为例
  • 【数据库系列】Spring Boot如何配置Flyway的回调函数
  • 跨 CA 签发多个证书的 Nginx mTLS 配置
  • web安全从0到1:burp-suite4
  • 【Web】0基础学Web—html基本骨架、语义化标签、非语义化标签、列表、表格、表单
  • Qt 信号与槽:UI设计的基础
  • redis的应用--分布式锁