当前位置: 首页 > 面试题库 >

JIT编译代码位于何处?

邓毅
2023-03-14
问题内容

所以我有用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在JVM中生成的本机代码吗? 问题答案: 假设你使用的是Sun Hotspot JVM(即Oracle 在java.com上提供的JVM ),则可以添加该标志 在运行代码时。这将打印出由JIT编译器生成的优化代码,而将其余部分省去。 如果要查看整个字节码,包括未优化的部分,请添加

  • 所以我有一个用Java编写的方法: 假设我的应用程序调用了很多次... 在Java虚拟机上运行该方法的编译代码时,JVM将首先解释该方法。然后一段时间后,如果我理解正确,它将决定将其编译为机器语言。 此时, 它会被内存中的机器代码覆盖吗?如果被覆盖,大小差异问题将如何解决?如果将其写入内存中的其他位置,加载到内存中的字节码是否会被释放?而且,如果字节码和jit编译的代码都在内存中,当应用程序再次点

  • 问题内容: Sun的规范JVM实现对字节码进行了一些相当复杂的优化,以在代码运行几次后获得接近本机的执行速度。 问题是,为什么没有将此编译后的代码缓存到磁盘以供以后使用同一功能/类时使用? 就目前而言,每次执行程序时,JIT编译器都会重新启动,而不是使用代码的预编译版本。当本质上解释字节码时,是否添加此功能不会大大提高程序的初始运行时间? 问题答案: 我不求助于@MYYN发布的链接的’n’past

  • 主要内容:JIT编译器语法,JIT编译器的风险和假设JIT 编译器是用 C++ 编写的,用于将 Java 转换为字节码。现在 Java 10 可以选择启用基于 Java 的实验性 JIT 编译器 Graal 来代替标准的 JIT 编译器。Graal 正在使用 Java 9 中引入的 JVMCI,即 JVM 编译器接口。 Graal 在 Java 9 中也可用。使用 Java 10,我们可以启用 Graal 来测试和调试实验性 JVM 编译器。 JI

  • 这个问题与android系统有关。Dalvik VM使用JIT概念,这意味着当您第一次运行应用程序时,Dalvik VM编译它并加载到RAM中,只要它能留在那里。我理解这个概念。而新的称为ART的虚拟机则使用AOT方法。ART编译应用程序后,你安装它(或当你正在安装它?)。这意味着什么?ART编译的应用程序与已编译的应用程序(如C应用程序)相同,但运行在与其他操作系统分离的独立进程中?谁能更透彻地

  • 1.1. 代码编译 1.1.1. Openwrt编译 1.1.2. Kernel编译 1.1.3. Uboot编译 1.1.4. VSP编译 1.1. 代码编译 1.1.1. Openwrt编译 作为Kamino18 YODAOS的整体编译环境,使用openwrt可以编译出系统正常运行所需的主要image如下: 镜像名字 镜像运行位置 镜像说明 镜像生成位置 mcu.bin MCU The ima