JIT编译代码位于何处?
所以我有用Java编写的这种方法:
public void myMethod(int y){ int x = 5 + y;
doSomething(x);
}
并假设我的应用程序多次调用此方法。
在Java虚拟机上为该方法运行编译后的代码时,JVM将首先解释该方法。然后经过一段时间,如果我理解正确,它将决定将其编译为机器语言。
这一点,
会被内存中的机器代码覆盖吗?如果覆盖,大小差异问题将如何解决?如果将其写入内存中的其他位置,加载到内存中的字节码是否会释放?而且,如果字节代码和jit编译代码都在内存中,那么当应用程序再次使用此方法时,JVM如何决定执行jit编译代码而不是字节代码?
回答:
HotSpot JVM
在元空间(或早期版本中的PermGen)中具有方法结构。它包含永远不会被覆盖的方法字节码和一个指向已编译代码的指针,该指针最初为NULL,直到方法被编译为止。
一个方法可能具有多个入口点:
_i2i_entry
-指向字节码解释器的指针。_code->entry_point()
-JIT编译代码的入口点。编译的方法位于CodeCache
-VM动态生成的代码的本机内存的特殊区域。i2c
和c2i
适配器以从解释器调用已编译的代码,反之亦然。这些适配器是必需的,因为解释的方法和编译的方法具有不同的调用约定(参数传递方式,帧构造方式等)。
编译后的方法可能会包含一些不常见的陷阱,在某些极少数情况下会回落到解释器。此外,Java方法可以动态地重新编译多次,因此JVM无法丢弃原始字节码。无论如何都没有释放它的意义,因为字节码通常比编译后的代码小得多。
以上是 JIT编译代码位于何处? 的全部内容, 来源链接: utcz.com/qa/403211.html