深入拆解 Java 虚拟机
郑雨迪
Oracle 高级研究员,计算机博士
87446 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
模块四:黑科技 (3讲)
深入拆解 Java 虚拟机
15
15
1.0x
00:00/00:00
登录|注册

34 | Graal:用Java编译Java

实践环节
Graal编译结果的性能优势
intrinsic方法的实现
激进的投机性优化手段
各个优化阶段构成的前端
前端采用Sea-of-Nodes IR
前端和后端两大部分
性能方面的比较
Graal更加模块化,易于开发和维护
Graal是用Java写的,C2是用C++写的
将生成的二进制码部署至代码缓存
获取编译所需的元数据和profile
响应编译请求
总结与实践
Graal的实现
Graal和C2的区别
支持Java程序直接调用Graal进行编译和部署
通过JVMCI解耦合Java虚拟机与Graal
与Java虚拟机的交互
可以通过Java虚拟机参数启用
从Java 9u开始被集成自JDK中
用Java编写的即时编译器
支持通过即时编译技术将混杂了不同的编程语言的代码编译到同一段二进制码中,实现不同语言之间的无缝切换
移除了编程语言之间的边界
可以集成至数据库中运行
可以通过AOT编译成可执行文件单独运行
可以在传统的OpenJDK上运行
多种编程语言支持
高性能
Graal编译器
GraalVM项目

该思维导图由 AI 生成,仅供参考

最后这三篇文章,我将介绍 Oracle Labs 的 GraalVM 项目。
GraalVM 是一个高性能的、支持多种编程语言的执行环境。它既可以在传统的 OpenJDK 上运行,也可以通过 AOT(Ahead-Of-Time)编译成可执行文件单独运行,甚至可以集成至数据库中运行。
除此之外,它还移除了编程语言之间的边界,并且支持通过即时编译技术,将混杂了不同的编程语言的代码编译到同一段二进制码之中,从而实现不同语言之间的无缝切换。
今天这一篇,我们就来讲讲 GraalVM 的基石 Graal 编译器。
在之前的篇章中,特别是介绍即时编译技术的第二部分,我们反反复复提到了 Graal 编译器。这是一个用 Java 写就的即时编译器,它从 Java 9u 开始便被集成自 JDK 中,作为实验性质的即时编译器。
Graal 编译器可以通过 Java 虚拟机参数-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler启用。当启用时,它将替换掉 HotSpot 中的 C2 编译器,并响应原本由 C2 负责的编译请求。
在今天的文章中,我将详细跟你介绍一下 Graal 与 Java 虚拟机的交互、Graal 和 C2 的区别以及 Graal 的实现细节。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

GraalVM是一个高性能的、支持多种编程语言的执行环境,可以在传统的OpenJDK上运行,也可以通过AOT编译成可执行文件单独运行,甚至可以集成至数据库中运行。Graal编译器是GraalVM的基石,用Java编写,从Java 9u开始被集成自JDK中。Graal与Java虚拟机的交互包括响应编译请求、获取编译所需的元数据和反映程序执行状态的profile,以及将生成的二进制码部署至代码缓存。Graal和C2的区别在于Graal是用Java写的,更加模块化且易于开发与维护,性能优势在于对新语法、新语言更加友好。Graal编译器将编译过程分为前端和后端两大部分,采用Sea-of-Nodes IR和激进的投机性优化手段。Graal支持自定义假设和intrinsic方法,提供了一种替换方法调用的机制。 Graal是一个用Java写就的、并能够将Java字节码转换成二进制码的即时编译器。它通过JVMCI与Java虚拟机交互,响应由后者发出的编译请求、完成编译并部署编译结果。 对Java程序而言,Graal编译结果的性能略优于OpenJDK中的C2;对Scala程序而言,它的性能优势可达到10%(企业版甚至可以达到20%!)。这背后离不开Graal所采用的激进优化方式。 在实践中,读者可以尝试使用附带Graal编译器的JDK。在Java 10,11中,可以通过添加虚拟机参数`-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler`来启用,或者下载部署在上的基于Java 8的版本。在刚开始运行的过程中,Graal编译器本身需要被即时编译,会抢占原本可用于编译应用代码的计算资源。因此,目前Graal编译器的启动性能会较差。最后一篇会介绍解决方案。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Java 虚拟机》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • Len
    我们可不可以把 profile 和编译的机器码保存到磁盘,在代码和运行平台不变的情况下,下次启动(或部署多实例)的时候直接装载这部分数据?这算作是一种系统预热的可行性方案吗?

    作者回复: 赞想法!已经有这种做法,但同时需要承担profile不能反映当前执行状态的风险。可以了解一下Alibaba的JWarmup。

    2018-10-12
    25
  • 金龙
    GraalVM和JVM是什么关系?它在OpenJDK上是怎么运行的?求解惑

    作者回复: 你可以将GraalVM看成泛指带Graal编译器的虚拟机。 在OpenJDK 10和11,可以直接UnlockExperimentalOptions UseJVMCICompiler开启。

    2018-10-08
    2
    10
  • xiaobang
    openjdk里Graal自身的及时编译是调用Graal自身吗?如果这么做会不会出现无穷递归?

    作者回复: 1. 默认情况下,是用C1编译Graal。 2. 调用Graal编译Graal并不会造成无穷递归。因为JVM里有解释执行器,能够执行Graal代码。

    2018-10-10
    7
  • ZY
    GraalVM大概什么时候会发布release版本?

    作者回复: Soon :) 如果只是用HotSpot中的Graal编译器,那已经挺成熟了,Twitter已经全面部署了。

    2018-10-16
    3
  • 阅过留痕 最后几篇了,这个专栏马上结束了,回头想想自己都学到了那些内容了呢? JVM的各个部分从外到内,由浅入深老师都讲到了,大部分内容是都挺明白了,有些还有待消化,不过下面还要继续的学习,专栏的目标是带我们入门! 本节讲解的Graal先混个脸熟,以后继续深入 1:Graal是一个编译器,是使用java语言编写的编译器,既然是编译器就拥有编译器的各种特点(主要负责接收JAVA字节码,并且声称可以直接运行的二进制码),当然,后来者通常比先来的会多一些特点,否则也没有必要来啦!Graal性能相对来说更好一点、更具模块化、更易维护(相对C2而言)Graal编译器是一个即时编译器,从JDK9就被集成到JDK中了,当然,可能还不成熟时作为一个实验性质的编译器集成到JDK中的,可以有选择的行的启动或者关闭。 2:Graal编译器是GraalVm的基石,编译器是VM的一部分,相对来说比较独立,它和JVM的交互主要有如下三部分, 2-1)响应变异请求 2-2)获取编译所需的元数据(如:类、方法、字段)和反应程序执行状态的profile 2-3)将生成的二进制码不熟至代码缓存里 3:Graal和JVM通过JVMCI来实现解耦,本质是通过java语言层面的接口来实现解耦的 嗯,感觉有些懵懂,专栏快结束了,老师辛苦了,希望老师来点随学随用的分析jvm性能瓶颈和解决方式的例子,当然,这个部分内容网上也比较多,只是希望更系统一点,举几个高频的示例!
    2018-10-14
    7
  • null
    求证: 同样的代码,使用jdk1.6编译的和使用jdk1.8编译,在同样的jdk1.8的jvm环境运行,性能是否有差异? 是不是需要看1.6的javap和1.8的javap 出来的字节码是否有差别?
    2019-04-17
    2
  • Geek_2ab487
    你好,我在使用graalVM native-image进行部署spring项目时有几个问题,1.打包成可执行文件后,jvm一些参数包括gc、堆栈大小这些要怎么设置 2.使用native-image提前编译后,实际运行时还会进行即时编译吗?
    2020-07-23
    2
    1
  • colin
    其实我好奇openJdk是不是可以代替Oracle 的Jdk呢
    2019-05-31
    2
    1
  • MasterOogway
    JMH跑了一段时间,graal比默认的性能提升约5%。应该不是误差
    2021-04-20
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部