rat*_*olt 6 java linux jit native dynamic-loading
在Java中,JVM(例如HotSpot)能够进行JIT编译,并且该技术用于通过将字节码编译为本机代码来加速执行.我的问题是,这在技术上是如何发生的?我的理解是,现代处理器将内存区域标记为只读部分,以及可执行部分以防止恶意代码执行.因此,JVM无法将新的"可执行代码"写入它可以访问的内存空间(即自修改代码).所以,我猜测JVM生成本机代码,将其写入文件然后使用操作系统服务将该本机代码动态加载到内存中,
我确实看到了这个答案:如何将JIT编译的代码注入内存并执行?,但我很困惑为什么操作系统会允许用户程序READ + EXECUTE内存区域.其他操作系统,即Linux等提供类似的东西,以便JIT工作吗?
有人可以帮助澄清我的理解吗?
在 Linux 中,可以将内存段设置为可写和可执行(并且可以稍后更改其保护)。查看mmap(2)和mprotect(2)系统调用。
JVM 可能会在内存中生成机器代码,而不使用任何磁盘文件。它的 JIT 机制可能只是在可执行内存中写入字节。
请注意,JVM 可能不想更改生成的机器代码保护(它可能会在可写和可执行内存段中生成所有机器代码),因为由于它自己生成该代码,因此可以确保不会做讨厌的事情(阅读有关携带证明的代码)。
阅读实时编译以及HotSpot和虚拟内存wiki 页面,并尝试执行strace一些java过程...
一些 JVM 是免费软件(例如OpenJdk 中的那个),您可以研究它们的源代码。