JVM是什么
剛入門的時候老師教我們寫代碼是這樣的:
?
寫JAVA文件然后用javac命令編譯成class文件運行即可。
?
隨著學習的不斷拓展和工作中業務代碼的積累,對于“為什么會這樣”的困惑越來越多,于是寫了這篇博客~。
計算機能看懂的是二進制,也就是0和1。那么我們的JAVA程序和計算機又有什么關聯呢?他們是怎么聯系到一起的?
匯編語言
計算機只能識別0和1,人們發現利用0和1可以做很多事情:
?
比如可以做加法,由此減乘法除法(利用的也是加法)也可以做到;與,或,異或等這些構成了與門,非門等這些邏輯門;......在這上面進行擴展又可以做很多事情。
?
但是編寫0和1太過于麻煩,這個時候出現了助記符也就是用一個英文代表一串01的數字,也就是匯編語言。
高級語言
對于開發者來說,用匯編寫代碼不太現實,一個簡單的操作要用很多行匯編代碼才能實現,所以再它之上做了處理,比如java,c,等等高級語言。那么計算機怎么識別高級語言的呢?
虛擬機是什么
答案是虛擬機,虛擬機可以理解為虛擬計算機,虛擬計算機通過解釋器將其認識的指令解釋為計算機認識的指令。JVM中只通過解釋器來解釋運行效率太慢,所以對于熱點代碼即反復執行的代碼通過JIT即時編譯器將其編譯為本地代碼。這個編譯器叫做后端編譯器。
?
JVM流行的一點原因是其跨平臺性:一次編譯,多端運行
怎么實現的大家也大概猜到了,JVM虛擬機識別操作系統將class字節碼轉換為不同操作系統可以識別的指令。
?
java代碼如何轉換成機器識別的代碼
我們寫代碼的時候通過編寫JAVA文件,通過javac命令編譯成class文件,用java命令運行class文件。
拆分:一,也就是javac命令將java代碼編譯成為java字節碼也就是class文件,這個編譯器叫做前端編譯器。編譯后的class文件由0和1構成,這其實是java字節碼的結構。
二,通過類加載器ClassLoader的加載,鏈接,初始化后將其轉換為JVM內存中的數據。我們要想看到class字節碼結構是什么樣的,可以通過反編譯class文件,講解JAVA字節碼文件將在后面博客中詳細介紹。
三,執行引擎將高級語言翻譯為機器語言即計算機能夠識別的語言。
總結:前端編譯器將Java文件轉換為字節碼class文件,通過類加載器ClassLoader的加載,鏈接,初始化這三步加載到內存中,JVM識別字節碼文件將數據放到對應的內存結構中,但是機器不認識這些字節碼文件,所以執行引擎又進行了編譯轉化為計算機能夠識別的指令【后端編譯器】,其充當了轉換字節碼的任務(通過解釋器解釋運行,但是由于效率低,所以對于熱點代碼通過JIT即時編譯器編譯成本地代碼)
最后來張圖:圖中運行時數據區為JVM內存結構中的,下一篇博客進行講解~。
在這里插入圖片描述
-
二進制
+關注
關注
2文章
794瀏覽量
41603 -
JAVA
+關注
關注
19文章
2960瀏覽量
104565 -
Class
+關注
關注
0文章
53瀏覽量
19714 -
JVM
+關注
關注
0文章
157瀏覽量
12211
發布評論請先 登錄
相關推薦
評論