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

學習JVM的重要性

從上層應用程序到底層操做系統,到底有哪些東西?html


平時開發的應用程序主要基於各類框架,譬如Spring,SpringMVC,Mybatis,而各類框架又是基於Java API來實現的,Java API調用執行是在JVM上的,而JVM則是運行在操做系統上的,操做系統是在物理機器打交道的。前端

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

  • 運行系統卡死,系統沒法訪問,直接 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虛擬機,虛擬機規範會直接勸退:oracle

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

【做者簡介】
秦懷,公衆號【秦懷雜貨店】做者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。這個世界但願一切都很快,更快,可是我但願本身能走好每一步,寫好每一篇文章,期待和大家一塊兒交流。

相關文章
相關標籤/搜索