JVM筆記 -- Java跨平臺和JVM跨語言
阿新 • • 發佈:2021-01-30
## 學習JVM的重要性
從上層應用程式到底層作業系統,到底有哪些東西?
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210114002215.png)
平時開發的應用程式主要基於各種框架,譬如`Spring`,`SpringMVC`,`Mybatis`,而各種框架又是基於`Java API`來實現的,`Java API`呼叫執行是在`JVM`上的,而`JVM`則是執行在作業系統上的,作業系統是在物理機器打交道的。
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210113235309.png)
在框架上進行業務開發,或者學習框架如何使用,是大部分開發者的工作。但是實際上我們不該執著於框架該如何使用,而是應該往下走,一般最後遇到的問題都會到`JVM`和作業系統的問題。即使現在的 `JVM` 已經很完善,幫開發者做了很多事,但是我們不該以此為理由不去了解 `JVM` 的原理。架構師把開發者變成溫室裡的花朵和溫水裡的青蛙,如果有一天出現以下問題,該怎麼解決:
- 執行系統卡死,系統無法訪問,直接 `OOM` 。
- 線上 `GC` (垃圾回收)有問題,需要 `dump` 記憶體,進行分析。
- 新專案上線,需要對系統進行評估,設定 `JVM` 的引數。
- 面試時被問及實際專案中 `JVM` 引數調優。
幾乎所有的高階語言在交給機器CPU執行之前,都會經歷 **高階語言 --> 組合語言 --> 機器指令** 的過程,因為計算機是不會直接識別高階語言的。瞭解高階語言如何轉換成能被機器識別的語言,是開發者必須掌握的技能。
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210116142340.png)
`Java`比`C++`多了動態記憶體分配以及垃圾回收技術,`Java`的虛擬機器幫開發者做了垃圾收集,編譯優化等一系列工作,裡面的垃圾收集演算法有哪些?怎麼執行的?`JIT`編譯器是怎麼工作的?這些往往也是面試常談的話題。懂得`JVM`的內部機構和工作機制,有利於設計高拓展的應用和快速診斷執行時的問題。
## 如何學習JVM
去官網找虛擬機器規範(英文版):
https://www.oracle.com/cn/java/technologies/javase-downloads.html
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210116152110.png)
找到:`Java Language and Virtual Machine Specifications`:
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210116152135.png)
開啟之後是:https://docs.oracle.com/javase/specs/index.html ,也就是Java語言和虛擬機器的規範。
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210116152402.png)
可以選擇以下書籍,如果是初學,最好學周志明老師的深入理解`Java`虛擬機器,虛擬機器規範會直接勸退:
- Java虛擬機器規範(`Java SE 8版`)
- 深入理解Java虛擬機器(JVM高階特性與最佳實踐)
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210116153436.png)
`Java`規範只是標準,不同的版本規範不一樣,同一個版本的規範在不同的虛擬機器上有不一樣的實現,初學者應該從最熱門主流的`HotSpot`虛擬機器開始,也就是Oracle自己推出的Java虛擬機器。
通過`cmd`可以看出,我裝的`Java`環境使用的就是64位的`HotSpot`虛擬機器:
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210116154122.png)
## 如何真正搞懂JVM?
在瞭解JVM規範和原理的情況下,自己手動實現一個簡易的Java虛擬機器。對於大部分人來說,挺難的,但是世間萬物,為之則不難,不為,則難。一步登天則難,步步為營則不難。
語言排行版,目前Java是第二名:
https://www.tiobe.com/tiobe-index/
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210116163320.png)
世界上沒有最好的程式語言,需要按照具體的使用場景來說話。
## Java跨平臺怎麼理解?
Java是一門跨平臺語言,所謂跨平臺就是,Java原始檔會被編譯成為位元組碼檔案,不管是Windows,Linux還是Mac,都有其適配的JVM,也就是位元組碼檔案可以隨意在這些JVM上去執行。
> Write once,run anywhere.
其他的語言,例如c語言,編譯成為機器碼之後,由於底層的機器語言支援不一樣,編譯後的機器語言檔案是不可以跨作業系統執行的。而Java則是把相容的工作,交給了JVM。不同的JVM負責去適配不同的作業系統。
所有的Java虛擬機器都遵守java虛擬機器的規範,語言編寫者不需要考慮相容問題。
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210116165137.png)
> Java虛擬機器是Java平臺的基石。 它是技術的組成部分,負責硬體和作業系統的獨立性,已編譯程式碼的小尺寸以及保護使用者免受惡意程式攻擊的能力。
> Java虛擬機器是抽象的計算機。 像真正的計算機一樣,它具有指令集並在執行時操作各種記憶體區域。 使用虛擬機器實現程式語言是相當普遍的。 最知名的虛擬機器可能是UCSD Pascal的P程式碼計算機。
## JVM 跨語言怎麼理解?
`JVM`是跨語言的平臺,很多語言都可以編譯成為遵守規範的位元組碼,這些位元組碼都可以在`Java`虛擬機器上執行。**Java虛擬機器不關心這個位元組碼是不是來自於Java程式**,只需要各個語言提供自己的編譯器,位元組碼遵循位元組碼規範,比如位元組碼的開頭是`CAFEBABY`。
![](https://markdownpicture.oss-cn-qingdao.aliyuncs.com/20210116213037.png)
將各種語言編譯成為位元組碼檔案的編譯器,稱之為前端編譯器。而`Java`虛擬機器中,也有編譯器,比如即時編譯器,此處稱為後端編譯器。
`Java`虛擬機器要做到跨語言,目前來看應該是當下最強大的虛擬機器。但是並非一開始設計要跨語言。
**跨語言的平臺有利於什麼?**
由於有了跨語言平臺,多語言混合程式設計就更加方便了,通過特定領域的語言去解決特定領域的問題。
比如並行處理使用`Clojure`語言編寫,展示層使用`JRuby/Rails`,中間層用`Java`編寫,每一應用層都可以使用不同的語言編寫,介面對於開發者是透明的。不同語言可以相互呼叫,就像是呼叫自己語言原生的API一樣。它們都執行在同一個虛擬機器上。
## 何為位元組碼?
位元組碼狹義上是`java`語言編譯而成,但是由於`JVM`是支援多種語言編譯的位元組碼的,而位元組碼都是一個標準規範,因為我們應該稱其為`JVM`位元組碼。
不同的編譯器,可以編譯出相同的位元組碼檔案,位元組碼檔案也可以在不同作業系統上的不同`JVM`中執行。
因此,`Java`虛擬機器實際上和`Java`語言並非強制關聯的關係,虛擬機器只和二級制檔案(`Class`檔案)強關聯。
**【作者簡介】**:
秦懷,公眾號【**秦懷雜貨店**】作者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。這個世界希望一切都很快,更快,但是我希望自己能走好每一步,寫好每一篇文章,期待和你們一起