JVM筆記 -- Java跨平臺和JVM跨語言

第十六封發表於2021-01-30

學習JVM的重要性

從上層應用程式到底層作業系統,到底有哪些東西?


平時開發的應用程式主要基於各種框架,譬如Spring,SpringMVC,Mybatis,而各種框架又是基於Java API來實現的,Java API呼叫執行是在JVM上的,而JVM則是執行在作業系統上的,作業系統是在物理機器打交道的。

在框架上進行業務開發,或者學習框架如何使用,是大部分開發者的工作。但是實際上我們不該執著於框架該如何使用,而是應該往下走,一般最後遇到的問題都會到JVM和作業系統的問題。即使現在的 JVM 已經很完善,幫開發者做了很多事,但是我們不該以此為理由不去了解 JVM 的原理。架構師把開發者變成溫室裡的花朵和溫水裡的青蛙,如果有一天出現以下問題,該怎麼解決:

  • 執行系統卡死,系統無法訪問,直接 OOM
  • 線上 GC (垃圾回收)有問題,需要 dump 記憶體,進行分析。
  • 新專案上線,需要對系統進行評估,設定 JVM 的引數。
  • 面試時被問及實際專案中 JVM 引數調優。

幾乎所有的高階語言在交給機器CPU執行之前,都會經歷 高階語言 --> 組合語言 --> 機器指令 的過程,因為計算機是不會直接識別高階語言的。瞭解高階語言如何轉換成能被機器識別的語言,是開發者必須掌握的技能。

JavaC++多了動態記憶體分配以及垃圾回收技術,Java的虛擬機器幫開發者做了垃圾收集,編譯優化等一系列工作,裡面的垃圾收集演算法有哪些?怎麼執行的?JIT編譯器是怎麼工作的?這些往往也是面試常談的話題。懂得JVM的內部機構和工作機制,有利於設計高擴充的應用和快速診斷執行時的問題。

如何學習JVM

去官網找虛擬機器規範(英文版):
https://www.oracle.com/cn/java/technologies/javase-downloads.html

找到:Java Language and Virtual Machine Specifications:

開啟之後是:https://docs.oracle.com/javase/specs/index.html ,也就是Java語言和虛擬機器的規範。

可以選擇以下書籍,如果是初學,最好學周志明老師的深入理解Java虛擬機器,虛擬機器規範會直接勸退:

  • Java虛擬機器規範(Java SE 8版
  • 深入理解Java虛擬機器(JVM高階特性與最佳實踐)

Java規範只是標準,不同的版本規範不一樣,同一個版本的規範在不同的虛擬機器上有不一樣的實現,初學者應該從最熱門主流的HotSpot虛擬機器開始,也就是Oracle自己推出的Java虛擬機器。

通過cmd可以看出,我裝的Java環境使用的就是64位的HotSpot虛擬機器:

如何真正搞懂JVM?

在瞭解JVM規範和原理的情況下,自己手動實現一個簡易的Java虛擬機器。對於大部分人來說,挺難的,但是世間萬物,為之則不難,不為,則難。一步登天則難,步步為營則不難。

語言排行版,目前Java是第二名:
https://www.tiobe.com/tiobe-index/

世界上沒有最好的程式語言,需要按照具體的使用場景來說話。

Java跨平臺怎麼理解?

Java是一門跨平臺語言,所謂跨平臺就是,Java原始檔會被編譯成為位元組碼檔案,不管是Windows,Linux還是Mac,都有其適配的JVM,也就是位元組碼檔案可以隨意在這些JVM上去執行。

Write once,run anywhere.

其他的語言,例如c語言,編譯成為機器碼之後,由於底層的機器語言支援不一樣,編譯後的機器語言檔案是不可以跨作業系統執行的。而Java則是把相容的工作,交給了JVM。不同的JVM負責去適配不同的作業系統。

所有的Java虛擬機器都遵守java虛擬機器的規範,語言編寫者不需要考慮相容問題。

Java虛擬機器是Java平臺的基石。 它是技術的組成部分,負責硬體和作業系統的獨立性,已編譯程式碼的小尺寸以及保護使用者免受惡意程式攻擊的能力。
Java虛擬機器是抽象的計算機。 像真正的計算機一樣,它具有指令集並在執行時操作各種記憶體區域。 使用虛擬機器實現程式語言是相當普遍的。 最知名的虛擬機器可能是UCSD Pascal的P程式碼計算機。

JVM 跨語言怎麼理解?

JVM是跨語言的平臺,很多語言都可以編譯成為遵守規範的位元組碼,這些位元組碼都可以在Java虛擬機器上執行。Java虛擬機器不關心這個位元組碼是不是來自於Java程式,只需要各個語言提供自己的編譯器,位元組碼遵循位元組碼規範,比如位元組碼的開頭是CAFEBABY

將各種語言編譯成為位元組碼檔案的編譯器,稱之為前端編譯器。而Java虛擬機器中,也有編譯器,比如即時編譯器,此處稱為後端編譯器。

Java虛擬機器要做到跨語言,目前來看應該是當下最強大的虛擬機器。但是並非一開始設計要跨語言。

跨語言的平臺有利於什麼?
由於有了跨語言平臺,多語言混合程式設計就更加方便了,通過特定領域的語言去解決特定領域的問題。

比如並行處理使用Clojure語言編寫,展示層使用JRuby/Rails,中間層用Java編寫,每一應用層都可以使用不同的語言編寫,介面對於開發者是透明的。不同語言可以相互呼叫,就像是呼叫自己語言原生的API一樣。它們都執行在同一個虛擬機器上。

何為位元組碼?

位元組碼狹義上是java語言編譯而成,但是由於JVM是支援多種語言編譯的位元組碼的,而位元組碼都是一個標準規範,因為我們應該稱其為JVM位元組碼。

不同的編譯器,可以編譯出相同的位元組碼檔案,位元組碼檔案也可以在不同作業系統上的不同JVM中執行。

因此,Java虛擬機器實際上和Java語言並非強制關聯的關係,虛擬機器只和二級制檔案(Class檔案)強關聯。

【作者簡介】
秦懷,公眾號【秦懷雜貨店】作者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。這個世界希望一切都很快,更快,但是我希望自己能走好每一步,寫好每一篇文章,期待和你們一起交流。

相關文章