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动态生成的代码的本机内存的特殊区域。
  • i2cc2i适配器以从解释器调用已编译的代码,反之亦然。这些适配器是必需的,因为解释的方法和编译的方法具有不同的调用约定(参数传递方式,帧构造方式等)。

编译后的方法可能会包含一些不常见的陷阱,在某些极少数情况下会回落到解释器。此外,Java方法可以动态地重新编译多次,因此JVM无法丢弃原始字节码。无论如何都没有释放它的意义,因为字节码通常比编译后的代码小得多。

以上是 JIT编译代码位于何处? 的全部内容, 来源链接: utcz.com/qa/403211.html

回到顶部