与非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文档以了解更多信息。
其他回答
在Java编译器生成字节代码(与体系结构无关)之后,执行将由JVM(在Java中)处理。字节代码将由加载器加载到JVM中,然后解释每个字节指令。
当我们需要多次调用一个方法时,我们需要多次解释相同的代码,这可能会花费更多的时间。所以我们有了JIT(即时)编译器。当字节被加载到JVM(它的运行时)中时,整个代码将被编译而不是解释,从而节省时间。
JIT编译器只在运行时工作,所以我们没有任何二进制输出。
20%的字节码在80%的时间内被使用。JIT编译器获得这些统计数据,并优化这20%的字节代码,通过添加内联方法、删除未使用的锁等,并创建特定于这台机器的字节码来更快地运行。我引用这篇文章,我发现它很方便。http://java.dzone.com/articles/just-time-compiler-jit-hotspot
正如其他人提到的
JIT代表Just-in-Time,这意味着代码在需要时才编译,而不是在运行时之前。
为了给上面的讨论补充一点,JVM维护一个函数执行时间的计数。如果该计数超过预定义的限制,JIT将代码编译为处理器可以直接执行的机器语言(不像一般情况下,javac将代码编译为字节码,然后java -解释器逐行解释这个字节码,将其转换为机器代码并执行)。
另外,下次计算此函数时,将再次执行相同的编译代码,而不像常规解释那样逐行重新解释代码。这使得执行速度更快。
JIT指的是一些JVM实现中的执行引擎,它更快,但需要更多内存,是一种即时编译器。在此方案中,方法的字节码在第一次调用方法时被编译为本机机器码。然后缓存该方法的本机机器码,以便下次调用相同的方法时可以重用它。
非jit编译器获取源代码,并在编译时将其转换为特定于机器的字节代码。JIT编译器获取编译时生成的与机器无关的字节代码,并在运行时将其转换为特定于机器的字节代码。Java使用的JIT编译器允许一个二进制文件无需修改就能在多种平台上运行。
推荐文章
- Go是如何编译得这么快的?
- 编译警告:对于架构i386,没有处理文件的规则
- LL和LR解析之间的区别是什么?
- 为什么Java在连续整数上的切换与添加的情况下运行得更快?
- Clang vs GCC——哪个生成更快的二进制文件?
- __PRETTY_FUNCTION__, __FUNCTION__, __func__之间的区别是什么?
- 为什么编译Python代码?
- 显示构建日期
- 编译语言与解释语言
- 为什么要用C语言链接数学库?
- 如何防止较少试图编译CSS calc()属性?
- 错误:java:无效的源代码发布:8 Intellij。这是什么意思?
- .NET 3.5 JIT在运行应用程序时无法工作
- Java JIT在运行JDK代码时会作弊吗?
- 如何检查Python脚本的语法而不执行它?