從上層應用程序到底層操做系統,到底有哪些東西?html
平時開發的應用程序主要基於各類框架,譬如Spring
,SpringMVC
,Mybatis
,而各類框架又是基於Java API
來實現的,Java API
調用執行是在JVM
上的,而JVM
則是運行在操做系統上的,操做系統是在物理機器打交道的。前端
在框架上進行業務開發,或者學習框架如何使用,是大部分開發者的工做。可是實際上咱們不應執着於框架該如何使用,而是應該往下走,通常最後遇到的問題都會到JVM
和操做系統的問題。即便如今的 JVM
已經很完善,幫開發者作了不少事,可是咱們不應以此爲理由不去了解 JVM
的原理。架構師把開發者變成溫室裏的花朵和溫水裏的青蛙,若是有一天出現如下問題,該怎麼解決:java
OOM
。GC
(垃圾回收)有問題,須要 dump
內存,進行分析。JVM
的參數。JVM
參數調優。幾乎全部的高級語言在交給機器CPU執行以前,都會經歷 高級語言 --> 彙編語言 --> 機器指令 的過程,由於計算機是不會直接識別高級語言的。瞭解高級語言如何轉換成能被機器識別的語言,是開發者必須掌握的技能。面試
Java
比C++
多了動態內存分配以及垃圾回收技術,Java
的虛擬機幫開發者作了垃圾收集,編譯優化等一系列工做,裏面的垃圾收集算法有哪些?怎麼執行的?JIT
編譯器是怎麼工做的?這些每每也是面試常談的話題。懂得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 SE 8版
)Java
規範只是標準,不一樣的版本規範不同,同一個版本的規範在不一樣的虛擬機上有不同的實現,初學者應該從最熱門主流的HotSpot
虛擬機開始,也就是Oracle本身推出的Java虛擬機。框架
經過cmd
能夠看出,我裝的Java
環境使用的就是64位的HotSpot
虛擬機:
在瞭解JVM規範和原理的狀況下,本身手動實現一個簡易的Java虛擬機。對於大部分人來講,挺難的,可是世間萬物,爲之則不難,不爲,則難。一步登天則難,步步爲營則不難。
語言排行版,目前Java是第二名:
https://www.tiobe.com/tiobe-index/
世界上沒有最好的編程語言,須要按照具體的使用場景來講話。
Java是一門跨平臺語言,所謂跨平臺就是,Java源文件會被編譯成爲字節碼文件,不論是Windows,Linux仍是Mac,都有其適配的JVM,也就是字節碼文件能夠隨意在這些JVM上去運行。
Write once,run anywhere.
其餘的語言,例如c語言,編譯成爲機器碼以後,因爲底層的機器語言支持不同,編譯後的機器語言文件是不能夠跨操做系統運行的。而Java則是把兼容的工做,交給了JVM。不一樣的JVM負責去適配不一樣的操做系統。
全部的Java虛擬機都遵照java虛擬機的規範,語言編寫者不須要考慮兼容問題。
Java虛擬機是Java平臺的基石。 它是技術的組成部分,負責硬件和操做系統的獨立性,已編譯代碼的小尺寸以及保護用戶免受惡意程序攻擊的能力。
Java虛擬機是抽象的計算機。 像真正的計算機同樣,它具備指令集並在運行時操做各類內存區域。 使用虛擬機實現編程語言是至關廣泛的。 最知名的虛擬機多是UCSD Pascal的P代碼計算機。
JVM
是跨語言的平臺,不少語言均可以編譯成爲遵照規範的字節碼,這些字節碼均可以在Java
虛擬機上運行。Java虛擬機不關心這個字節碼是否是來自於Java程序,只須要各個語言提供本身的編譯器,字節碼遵循字節碼規範,好比字節碼的開頭是CAFEBABY
。
將各類語言編譯成爲字節碼文件的編譯器,稱之爲前端編譯器。而Java
虛擬機中,也有編譯器,好比即時編譯器,此處稱爲後端編譯器。
Java
虛擬機要作到跨語言,目前來看應該是當下最強大的虛擬機。可是並不是一開始設計要跨語言。
跨語言的平臺有利於什麼?
因爲有了跨語言平臺,多語言混合編程就更加方便了,經過特定領域的語言去解決特定領域的問題。
好比並行處理使用Clojure
語言編寫,展現層使用JRuby/Rails
,中間層用Java
編寫,每一應用層均可以使用不一樣的語言編寫,接口對於開發者是透明的。不一樣語言能夠相互調用,就像是調用本身語言原生的API同樣。它們都運行在同一個虛擬機上。
字節碼狹義上是java
語言編譯而成,可是因爲JVM
是支持多種語言編譯的字節碼的,而字節碼都是一個標準規範,由於咱們應該稱其爲JVM
字節碼。
不一樣的編譯器,能夠編譯出相同的字節碼文件,字節碼文件也能夠在不一樣操做系統上的不一樣JVM
中運行。
所以,Java
虛擬機實際上和Java
語言並不是強制關聯的關係,虛擬機只和二級制文件(Class
文件)強關聯。
【做者簡介】:
秦懷,公衆號【秦懷雜貨店】做者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。這個世界但願一切都很快,更快,可是我但願本身能走好每一步,寫好每一篇文章,期待和大家一塊兒交流。