Skip to content

Commit 443a97a

Browse files
committed
Update java-basic-questions-01.md
再次修正前文的美团公众号文章链接,补充 GraalVM Native Image 的基础说明,降低初学者理解 AOT 相关内容的门槛。同时完善 PGO 的解释,使 JIT 与 AOT 的对比更加连贯易读。
1 parent a074f3a commit 443a97a

1 file changed

Lines changed: 4 additions & 4 deletions

File tree

docs/java/basis/java-basic-questions-01.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,17 +125,17 @@ JDK、JRE、JVM、JIT 这四者的关系如下图所示。
125125

126126
> 为了改善解释语言的效率而发展出的[即时编译](https://zh.wikipedia.org/wiki/即時編譯)技术,已经缩小了这两种语言间的差距。这种技术混合了编译语言与解释型语言的优点,它像编译语言一样,先把程序源代码编译成[字节码](https://zh.wikipedia.org/wiki/字节码)。到执行期时,再将字节码直译,之后执行。[Java](https://zh.wikipedia.org/wiki/Java)[LLVM](https://zh.wikipedia.org/wiki/LLVM)是这种技术的代表产物。
127127
>
128-
> 相关阅读:[基本功 | Java 即时编译器原理解析及实践](https://tech.meituan.com/2020/10/22/java-jit-practice-in-meituan.html)
128+
> 相关阅读:[基本功 | Java 即时编译器原理解析及实践](https://mp.weixin.qq.com/s/7PH8o1tbjLsM4-nOnjbwLw)
129129
130130
**为什么说 Java 语言“编译与解释并存”?**
131131

132132
这是因为常见的 Java 实现同时使用编译和解释技术:Java 源码先由编译器生成字节码(`.class` 文件),字节码可由 JVM 解释执行,也可在运行时由 JIT 编译为机器码。字节码并非必须由解释器执行,具体执行策略由 JVM 实现决定。
133133

134134
### AOT 有什么优点?为什么不全部使用 AOT 呢?
135135

136-
JDK 9 曾通过 JEP 295 引入实验性的 **AOT(Ahead of Time Compilation)** 工具 `jaotc`,但该工具已在 JDK 17 中移除。因此,JDK 17 及之后的标准 JDK 不再包含这套内置 AOT 编译器;下文讨论的是一般意义上的 AOT,以及 GraalVM Native Image 等独立工具链。和 JIT 不同,AOT 会在程序执行前将代码编译为机器码,能够减少运行时预热开销并改善启动速度,但具体的内存占用、峰值性能和适用场景取决于所使用的 AOT 实现与应用负载。
136+
JDK 9 曾通过 JEP 295 引入实验性的 AOT(Ahead of Time Compilation)工具 `jaotc`,但该工具已在 JDK 17 中移除。因此,JDK 17 及之后的标准 JDK 不再包含这套内置 AOT 编译器;下文讨论的是一般意义上的 AOT,以及 GraalVM Native Image 等独立工具链(Native Image 是 GraalVM 提供的一项 AOT 技术,后文会进一步介绍 GraalVM)。和 JIT 不同,AOT 会在程序执行前将代码编译为机器码,能够减少运行时预热开销并改善启动速度,但具体的内存占用、峰值性能和适用场景取决于所使用的 AOT 实现与应用负载。
137137

138-
下面的对比以常见的 HotSpot JIT 和 GraalVM Native Image 为例。不同 AOT 工具的实现方式并不完全相同,实际表现还会受到构建参数、PGO(Profile-Guided Optimization,基于性能数据的优化)和应用负载影响
138+
下面的对比以常见的 HotSpot JIT 和 GraalVM Native Image 为例。不同 AOT 工具的实现方式并不完全相同,实际表现还会受到构建参数、应用负载,以及是否使用 PGO(Profile-Guided Optimization,即利用程序实际运行时收集的性能信息辅助优化)等因素影响
139139

140140
| 对比维度 | JIT(即时编译) | AOT(提前编译) |
141141
| ---------------- | ---------------------------------------- | -------------------------------------------------- |
@@ -149,7 +149,7 @@ JDK 9 曾通过 JEP 295 引入实验性的 **AOT(Ahead of Time Compilation)*
149149

150150
<img src="https://oss.javaguide.cn/github/javaguide/java/basis/jit-vs-aot.png" alt="JIT vs AOT" style="zoom: 25%;" />
151151

152-
AOT 的优势主要体现在启动速度和运行时内存占用,比较适合冷启动频繁、实例生命周期较短或者需要快速扩容的应用。JIT 能根据程序运行时收集到的信息优化热点代码,长时间运行的服务通常更容易发挥这方面的优势。二者的吞吐量和延迟表现不能只由编译方式直接下结论,还需要结合具体工具链和实际负载测试。
152+
AOT 的优势主要体现在启动速度和运行时内存占用,比较适合冷启动频繁、实例生命周期较短或者需要快速扩容的应用。JIT 则能根据程序运行时收集到的信息优化热点代码,长时间运行的服务通常更容易发挥这方面的优势。二者的吞吐量和延迟表现不能只由编译方式直接下结论,还需要结合具体工具链和实际负载测试。
153153

154154
提到 AOT 就不得不提 [GraalVM](https://www.graalvm.org/) 了!GraalVM 是一种高性能的 JDK(完整的 JDK 发行版本),它可以运行 Java 和其他 JVM 语言,以及 JavaScript、Python 等非 JVM 语言。 GraalVM 不仅能提供 AOT 编译,还能提供 JIT 编译。感兴趣的同学,可以去看看 GraalVM 的官方文档:<https://www.graalvm.org/latest/docs/>。如果觉得官方文档看着比较难理解的话,也可以找一些文章来看看,比如:
155155

0 commit comments

Comments
 (0)