加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

发布时间:2021-01-11 14:25:31 所属栏目:Linux 来源:网络整理
导读:在Java中,JVM(例如HotSpot)能够进行JIT编译,并且该技术用于通过将字节码编译为本机代码来加速执行.我的问题是,这在技术上是如何发生的?我的理解是,现代处理器将内存区域标记为只读部分,以及可执行部分以防止恶意代码执行.因此,JVM无法真正将新的“可执行

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

我确实看到了这个答案: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 compilation和HotSpot以及Virtual Memory维基页面,尝试分析一些java进程…

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

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读