当前位置:网站首页>簡述JVM(2)——本地方法接口和執行引擎

簡述JVM(2)——本地方法接口和執行引擎

2021-09-15 07:16:39 KookNut39

大家好,我是KookNut39也是Tommy,在CSDN寫文,寫Java時候我是Tommy,分享一些自己認為在學習過程中比較重要的東西,致力於幫助初學者入門,希望可以幫助你進步。感興趣的歡迎關注博主,和博主一起學習Java知識。大家還可以去專欄查看之前的文章,希望未來能和大家共同探討技術。

這篇文章是補充上篇文章沒寫完的內容,大家如果想看完整版,大家可以進入專欄,查看上篇文章

1.3 本地方法接口

本地方法就是底層不是由 Java 實現的方法,比如C/C++

一個本地方法就是一個Java調用非Java代碼的接口,這個特性不是 Java 獨有所有的語言都有這個特性,比如C++語言可能也會調用由C實現的底層函數。

定義一個本地方法時,不需要給它實現體,因為他的實現體是由非Java語言在外面實現的

關鍵字 native 可以與其他所有的 Java 標識符連用,但是 abstract 除外,因為這個類本來就是一個接口。

本地方法的用途:

  1. 與 Java 環境外交互:
    有時 Java應用需要與 Java外面的環境交互,這是本地方法存在的主要原因。你可以想想 Java 需要與一些底層系統,如某些硬件交換信息時的情况。本地方法正式這樣的一種交流機制:它為我們提供了一個非常簡潔的接口,而且我們無需去了解 Java應用之外的繁瑣細節。

  2. 與操作系統交互(比如線程最後要回歸於操作系統線程):

    JVM 支持著 Java 語言本身和運行庫,它是 Java 程序賴以生存的平臺,它由一個解釋器(解釋字節碼)和一些連接到本地代碼的庫組成。然而不管他有多麼的强大,它畢竟不是一個完整的系統,它經常依賴於一些底層系統的支持。這些底層系統常常是强大的操作系統。通過使用本地方法,我們得以用 Java 實現了 jre 的與底層系統的交互,甚至 JVM的一些部分就是用 C 寫的。還有,如果我們要使用一些 Java 語言本身沒有提供封裝的操作系統特性時,我們也需要使用本地方法。

1.4執行引擎

JVM 的主要任務是負責裝載字節碼到其內部,但字節碼並不能够直接運行在操作系統之上,因為字節碼指令並非等價於本地機器指令,它內部包含的僅僅只是一些能够被 JVM 所識別的字節碼指令、符號錶,以及其他輔助信息。那麼,如果想要讓一個 Java 程序運行起來,執行引擎(Execution Engine)的任務就是將字節碼指令解釋/編譯為對應平臺上(操作系統)的本地機器指令才可以。簡單來說,JVM 中的執行引擎將高級語言翻譯為機器語言,這樣機器就認識了。

前端編譯和後端編譯

  1. 前端編譯:從Java程序文件(.java)到字節碼文件(.class)
  2. 後端編譯:在運行時把 .class 文件編譯成本地機器碼

解釋器和 JIT 編譯器

  1. 解釋器:當 Java 虛擬機啟動時會根據預定義的規範對字節碼采用逐行解釋的方式執行,將每條字節碼文件中的內容“翻譯”為對應平臺的本地機器指令執行。
  2. JIT(Just In Time Compiler)編譯器:就是虛擬機將源代碼一次性全部直接編譯成和本地機器平臺相關的機器語言,但並不是馬上執行。

提到這就不得不提半編譯半解釋型語言:

就是即解釋也編譯,這樣做的好處就是響應快,效率高。

為什麼Java是半編譯半解釋型語言

JVM 設計者為了滿足 Java 程序實現跨平臺特性,所有沒有由高級語言直接生成本地機器指令(操作系統不同本地機器指令也不同),從而誕生了實現解釋器在運行時采用逐行解釋字節碼執行程序的想法。

解釋器真正意義上所承擔的角色就是一個運行時“翻譯者”,將字節碼文件中的內容“翻譯”為對應平臺的本地機器指令執行,因為解釋一句執行一句,所以執行效率比較低。

JIT 編譯器將字節碼翻譯成本地代碼後,就可以做一個緩存操作,執行效率就變高了。是否需要啟動 JIT 編譯器將字節碼直接編譯為對應平臺的本地機器指令,則需要根據代碼被調用執行的頻率而定。JIT 編譯器在運行時會針對那些頻繁被調用的“熱點代碼”做出深度優化,將其直接編譯為對應平臺的本地機器指令,以此提昇 Java 程序的執行性能。(一個被多次調用的方法,或者是一-個方法體內部循環次數較多的循環體都可以被稱之為“熱點代碼”。)

同時使用JIT 編譯器和解釋器的原因?

  1. 當程序啟動後,解釋器可以馬上發揮作用,響應速度快,省去編譯的時間,立即執行。
  2. 編譯器要想發揮作用,把代碼編譯成本地代碼,需要一定的執行時間,但編譯為本地代碼後,執行效率高。就需要采用解釋器與即時編譯器並存的架構來換取一個平衡點。

本次的分享到這裏就結束了,若發現文中不當之處,歡迎大家評論指點,碼字不易,如果喜歡,賞個點贊+評論+收藏,感謝您的支持

版权声明
本文为[KookNut39]所创,转载请带上原文链接,感谢
https://chowdera.com/2021/09/20210915071353419Q.html

随机推荐