簡體   English   中英

Java中的JIT編譯如何將動態編譯的指令加載到內存中?

[英]How does JIT compilation in Java load dynamically compiled instructions into memory?

在Java中,JVM(例如HotSpot)能夠進行JIT編譯,並且該技術用於通過將字節碼編譯為本機代碼來加速執行。 我的問題是,這在技術上是如何發生的? 我的理解是,現代處理器將內存區域標記為只讀部分,以及可執行部分以防止惡意代碼執行。 因此,JVM無法將新的“可執行代碼”寫入它可以訪問的內存空間(即自修改代碼)。 所以,我猜測JVM生成本機代碼,將其寫入文件然后使用操作系統服務將該本機代碼動態加載到內存中,並維護本機代碼(函數)位置的地址的一些內部映射表在操作系統加載了這個動態代碼之后,在內存中,它可以分支到那些本機指令。

我確實看到了這個答案: 如何將JIT編譯的代碼注入內存並執行? ,但我很困惑為什么操作系統會允許用戶程序READ + EXECUTE內存區域。 其他操作系統,即Linux等提供類似的東西,以便JIT工作嗎?

有人可以幫助澄清我的理解嗎?

在Linux中,可以將內存段設置為可寫和可執行(稍后可以對其保護進行更改)。 查看mmap(2)mprotect(2)系統調用。

JVM可能會在內存中生成機器代碼,而不使用任何磁盤文件。 它的JIT機器可能只是在可執行內存中寫入字節。

請注意,JVM可能不希望更改生成的機器代碼保護(它可能會生成可寫和可執行內存段中的所有機器代碼),因為它自己生成了代碼,因此可以確保不會做壞事(閱讀有關攜帶證明的代碼 )。

閱讀即時編譯HotSpot虛擬內存維基頁面,嘗試strace -ing一些java進程...

有些JVM是免費軟件(例如OpenJdk中的一個),你可以研究它們的源代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM