【问题标题】:How does JIT compilation in Java load dynamically compiled instructions into memory?Java中的JIT编译如何将动态编译的指令加载到内存中?
【发布时间】:2023-03-27 08:10:02
【问题描述】:

在 Java 中,JVM(例如 HotSpot)能够进行 JIT 编译,这种技术用于通过将字节码编译为本机代码来加速执行。我的问题是,这在技术上是如何发生的?我的理解是,现代处理器将内存区域标记为只读部分和可执行部分,以防止恶意代码执行。因此,JVM 不能真正将新的“可执行代码”写入它可以访问的内存空间(即自我修改代码)。所以,我猜 JVM 会产生原生代码,将其写入文件,然后使用操作系统服务将原生代码动态加载到内存中,并维护一些原生代码(函数)位置地址的内部映射表在操作系统加载此动态代码后在内存中,以便它可以分支到那些本机指令。

我确实看到了这个答案:How is JIT compiled code injected in memory and executed?,但我对操作系统为什么允许用户程序读取+执行内存区域感到困惑。其他操作系统(例如 Linux 等)是否提供了类似的功能以使 JIT 工作?

有人可以帮助澄清我的理解吗?

【问题讨论】:

    标签: java linux native jit dynamic-loading


    【解决方案1】:

    在 Linux 中,可以将内存段设置为可写和可执行(并且可以在以后更改其保护)。查看mmap(2)mprotect(2) 系统调用。

    JVM 可能会在内存中生成机器代码,而不使用任何磁盘文件。它的 JIT 机器可能只是在可执行内存中写入字节。

    请注意,JVM 可能不想更改生成的机器代码保护(它可能会在可写和可执行的内存段中生成所有机器代码),因为它正在生成自己的代码,因此可以确保不做讨厌的事情(阅读proof-carrying code)。

    阅读Just-in-time compilationHotSpotVirtual Memory wiki 页面,并尝试strace-ing 一些java 过程...

    有些 JVM 是免费软件(例如 OpenJdk 里面的那个),你可以研究它们的源代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2011-07-17
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多