gpt4 book ai didi

java - Java中的JIT编译是如何将动态编译好的指令加载到内存中的?

转载 作者:IT王子 更新时间:2023-10-29 00:56:40 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

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

关于java - Java中的JIT编译是如何将动态编译好的指令加载到内存中的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17585339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com