【发布时间】: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