与非JIT编译器相比,JIT编译器具体做什么?有人能给出简洁易懂的描述吗?
当前回答
Just In Time编译器: 它将java字节码编译成特定CPU的机器指令。
例如,如果我们在java代码中有一个循环语句:
while(i<10){
// ...
a=a+i;
// ...
}
如果i的值为0,上述循环代码将运行10次。
没有必要一次又一次地编译字节码10次,因为相同的指令将执行10次。在这种情况下,只需要编译该代码一次,并且可以将值更改所需的次数。因此,Just In Time (JIT) Compiler会跟踪这些语句和方法(如上所述),并将这些字节代码片段编译为机器代码以获得更好的性能。
另一个类似的例子是在字符串/句子列表中使用“正则表达式”搜索模式。
JIT Compiler不会将所有代码编译为机器代码。它在运行时编译具有类似模式的代码。
请参阅了解JIT的Oracle文档以了解更多信息。
其他回答
一开始,编译器负责将高级语言(定义为比汇编程序更高级别)转换成目标代码(机器指令),然后(通过链接器)将其链接成可执行文件。
At one point in the evolution of languages, compilers would compile a high-level language into pseudo-code, which would then be interpreted (by an interpreter) to run your program. This eliminated the object code and executables, and allowed these languages to be portable to multiple operating systems and hardware platforms. Pascal (which compiled to P-Code) was one of the first; Java and C# are more recent examples. Eventually the term P-Code was replaced with bytecode, since most of the pseudo-operations are a byte long.
即时(JIT)编译器是运行时解释器的一个特性,它不是在每次调用方法时都解释字节码,而是将字节码编译为运行机器的机器代码指令,然后调用此目标代码。理想情况下,运行目标代码的效率将克服每次运行时重新编译程序的低效率。
Just In Time编译器: 它将java字节码编译成特定CPU的机器指令。
例如,如果我们在java代码中有一个循环语句:
while(i<10){
// ...
a=a+i;
// ...
}
如果i的值为0,上述循环代码将运行10次。
没有必要一次又一次地编译字节码10次,因为相同的指令将执行10次。在这种情况下,只需要编译该代码一次,并且可以将值更改所需的次数。因此,Just In Time (JIT) Compiler会跟踪这些语句和方法(如上所述),并将这些字节代码片段编译为机器代码以获得更好的性能。
另一个类似的例子是在字符串/句子列表中使用“正则表达式”搜索模式。
JIT Compiler不会将所有代码编译为机器代码。它在运行时编译具有类似模式的代码。
请参阅了解JIT的Oracle文档以了解更多信息。
正如其他人提到的
JIT代表Just-in-Time,这意味着代码在需要时才编译,而不是在运行时之前。
为了给上面的讨论补充一点,JVM维护一个函数执行时间的计数。如果该计数超过预定义的限制,JIT将代码编译为处理器可以直接执行的机器语言(不像一般情况下,javac将代码编译为字节码,然后java -解释器逐行解释这个字节码,将其转换为机器代码并执行)。
另外,下次计算此函数时,将再次执行相同的编译代码,而不像常规解释那样逐行重新解释代码。这使得执行速度更快。
JIT指的是一些JVM实现中的执行引擎,它更快,但需要更多内存,是一种即时编译器。在此方案中,方法的字节码在第一次调用方法时被编译为本机机器码。然后缓存该方法的本机机器码,以便下次调用相同的方法时可以重用它。
JIT编译器只在第一次执行时将字节码编译为等效的本机代码。在每次连续执行时,JVM仅使用已编译的本机代码来优化性能。
如果没有JIT编译器,JVM解释器将逐行转换字节码,使其看起来就像正在执行本机应用程序一样。
源
推荐文章
- 是否可以动态编译和执行c#代码片段?
- 为什么Java类的编译与空行不同?
- 如何使用cmake创建共享库?
- 在C和c++中静态变量存储在哪里?
- 无法加载文件或程序集…参数不正确
- 如果使用if-return-return或if-else-return?
- Java是编译型编程语言还是解释型编程语言?
- 为什么Swift的编译时间这么慢?
- 选项(RECOMPILE)总是更快;为什么?
- 如何在Angular 2.0中使用/创建动态模板来编译动态组件?
- 如何修复从源代码安装PHP时未发现xml2-config的错误?
- 用自己的语言编写编译器
- 带有返回类型的Java方法在没有返回语句的情况下编译
- 使用g++编译多个.cpp和.h文件
- 在Visual Studio中设置“首选32位”的目的是什么?它实际上是如何工作的?