8

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

我确实看到了这个答案:JIT 编译代码如何注入内存并执行?,但我很困惑为什么操作系统会允许用户程序读取+执行内存区域。其他操作系统(即 Linux 等)是否提供类似的东西以使 JIT 工作?

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

4

1 回答 1

5

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

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

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

阅读即时编译HotSpot虚拟内存wiki 页面,并尝试strace一些java过程......

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

于 2013-07-11T05:24:59.147 回答