亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是JVM?Java跨平臺的原理是什么?

什么是JVM?Java跨平臺的原理是什么?

鴻蒙傳說 2021-02-01 10:06:39
什么是JVM?Java跨平臺的原理是什么?
查看完整描述

2 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

首先我們要理解什么是跨平臺,所謂的跨平臺就是JAVA寫的一份代碼可以在任意的操作系統平臺上運行。

為什么跨平臺會成為一個問題呢?因為每一個操作系統平臺支持不同的指令集我們所寫的代碼經過編譯之后只能適用于一個平臺,換一個平臺就不支持了。而JAVA完美的解決了這個問題。

Java的一大特色就是“write once, run anywhere”即“一次編譯,到處運行”。就是說你不用專門為每個平臺寫一份代碼,你寫的Java程序在任何平臺都能跑起來。

它的實現原理是在系統層面上又增加了一層虛擬機(Java Virtual Machine,簡稱JVM),且為每個平臺都定制了對應的虛擬機。然后Java程序是在虛擬機上跑的,因此平臺無關。

Java的運行流程是:程序員寫了源代碼(Source Code,.java后綴,跨平臺),然后經過編譯器編譯成字節碼(Byte Code,.class后綴,二進制文件),字節碼是所有虛擬機都能理解的中間文件。然后交給虛擬機(每個平臺都有對應的虛擬機)去運行。

所以對“write once, run anywhere”更準確的理解是,“一次編譯,到處裝虛擬機,所以到處運行”。

整個流程如下圖所示。



查看完整回答
反對 回復 2021-03-28
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

java virtual machine

Java跨平臺的原理
Java的跨平臺是通過Java虛擬機(JVM)來實現的。
Java源文件的編譯過程
Java應用程序的開發周期包括編譯、下載、解釋和執行幾個部分。Java編譯程序將Java源程序翻譯為JVM可執行代碼—字節碼。這一編譯過程同C/C++的編譯有些不同。當C編譯器編譯生成一個對象的代碼時,該代碼是為在某一特定硬件平臺運行而產生的。因此,在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。Java編譯器卻不將對變量和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將這些符號引用信息保留在字節碼中,由解釋器在運行過程中創建內存布局,然后再通過查表來確定一個方法所在的地址。這樣就有效的保證了Java的可移植性和安全性。
Java解釋器的執行過程
運行JVM字節碼的工作是由解釋器來完成的。解釋執行過程分三步進行:代碼的裝入、代碼的校驗和代碼的執行。裝入代碼的工作由“類裝載器”(class loader)完成。類裝載器負責裝入運行一個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被其調用的類。當類裝載器裝入一個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其它類。在本臺計算機上的所有類都在同一地址空間內,而所有從外部引進的類,都有一個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。當裝入了運行程序需要的所有類后,解釋器便可確定整個可執行程序的內存布局。解釋器為符號引用同特定的地址空間建立對應關系及查詢表。通過在這一階段確定代碼的內存布局,Java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼對地址的非法訪問。
隨后,被裝入的代碼由字節碼校驗器進行檢查。校驗器可發現操作數棧溢出,非法數據類型轉換等多種錯誤。通過校驗后,代碼便開始執行了。
Java字節碼的兩種執行方式
1、即時編譯方式:解釋器先將字節碼編譯成機器碼,然后再執行該機器碼。
2、解釋執行方式:解釋器通過每次解釋并執行一小段代碼來完成Java字節碼程 序的所有操作。
  通常采用的是第二種方法。由于JVM規格描述具有足夠的靈活性,這使得將字節碼翻譯為機器代碼的工作具有較高的效率。對于那些對運行速度要求較高的應用程序,解釋器可將Java字節碼即時編譯為機器碼,從而很好地保證了Java代碼的可移植性和高性能。
JVM規格描述
JVM的設計目標是提供一個基于抽象規格描述的計算機模型,為解釋程序開發人員提供很好的靈活性,同時也確保Java代碼可在符合該規范的任何系統上運行。JVM對其實現的某些方面給出了具體的定義,特別是對Java可執行代碼,即字節碼(Bytecode)的格式給出了明確的規格。這一規格包括操作碼和操作數的語法和數值、標識符的數值表示方式、以及Java類文件中的Java對象、常量緩沖池在JVM的存儲映象。這些定義為JVM解釋器開發人員提供了所需的信息和開發環境。Java的設計者希望給開發人員以隨心所欲使用Java的自由。
JVM是為Java字節碼定義的一種獨立于具體平臺的規格描述,是Java平臺獨立性的基礎。
Java程序執行與C/C++程序執行的對比分析
如果把Java源程序想象成我們的C++源程序,Java源程序編譯后生成的字節碼就相當于C++源程序編譯后的80x86的機器碼(二進制程序文件),JVM虛擬機相當于80x86計算機系統,Java解釋器相當于80x86CPU。在80x86CPU上運行的是機器碼,在Java解釋器上運行的是Java字節碼。
Java解釋器相當于運行Java字節碼的“CPU”,但該“CPU”不是通過硬件實現的,而是用軟件實現的。Java解釋器實際上就是特定的平臺下的一個應用程序。只要實現了特定平臺下的解釋器程序,Java字節碼就能通過解釋器程序在該平臺下運行,這是Java跨平臺的根本。當前,并不是在所有的平臺下都有相應Java解釋器程序,這也是Java并不能在所有的平臺下都能運行的原因,它只能在已實現了Java解釋器程序的平臺下運行。



查看完整回答
反對 回復 2021-03-28
  • 2 回答
  • 0 關注
  • 425 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號