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


學習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文件)強關聯。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM