「即时编译」(JIT),它的优点和缺点是什么

Yang 1089

即时编译(JIT)是一种在程序运行时将代码编译成机器码的技术,以提高程序的执行速度。JIT 的优点是快速执行,不需要等待编译, 可以选择性地编译热点代码,省去了很多编译时间,也节省很多的空间,而缺点是相同的代码可能被翻译多次,比如循环内部的代码。

一、JIT 优点

JIT 的优点包括:

  • 快速执行,不需要等待编译。
  •  可以选择性地编译热点代码,省去了很多编译时间,也节省很多的空间。
  • 可以根据当前程序的运行情况生成优异的机器指令序列。
  • 当程序需要支持动态链接时,只能使用 JIT。
  • 可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用。

二、JIT 缺点:

  • 编译需要占用运行时资源,会导致进程卡顿。
  • 由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡。
  • 在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到较高性能。

延伸阅读

一、JIT 的分层机制

JIT 的分层机制是指 JIT 编译器会根据代码的热度,将代码分为多个层级,每个层级都有不同的编译策略和优化等级,以达到更好的性能。

这些层级通常包括:

  • 解释执行
  • 执行不带 profiling 的 C1 代码
  • 执行仅带调用次数以及循环回边执行次数 profiling 的 C1 代码
  • 执行带所有 profiling 的 C1 代码
  • 执行 C2 代码

其中,profiling 是在程序执行过程中,收集能够反映程序状态的数据,这会额外损失一些性能。所以同样是执行 C1 代码,执行性能是 1 > 2 > 3;4 执行 C2 代码性能是较高的。

二、JIT分类

事实上,JIT编译器分成两种:经济编译器和普通编译器。

1、经济JIT编译器

经济JIT编译器代表了运行一个Java应用程序所需要的最少功能,它直接用对等的本机代码取代每一条MSIL指令,不进行任何优化从而也带来更少的系统负载。这也意味着它主要应用在内存等资源比较紧张的平台上。

2、普通JIT编译器

普通JIT编译器则是缺省的运行时配置,它会对其产生的代码进行即时优化。这样做无形中给予了Java超出传统预编译语言的一个优点:预编译语言只能对其处理的代码将要运行于其上的平台做一番大致的事前估计。

JIT编译器可以经过准确调节达到当前运行时状态,结果可以完成一些预编译语言无法完成的工作:更高效地利用和分配CPU寄存器。在适当的情况下实施低级代码优化,比如常量重叠、拷贝复制、取消范围检查、取消常规副表达式以及方法内联等。

在代码执行期间监控当前的物理和虚拟内存需求从而更高效地利用内存,产生特定的平台指令以准确、充分地利用实际的处理器模式,NET编译的结果就是JIT所带来的额外负载要求并没有产生显著的性能损失。

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部