前言
在我們對java的越發(fā)了解之后拒担,我們開始把注意力投到了java虛擬機這一塊嘹屯。
我們意識到,java所謂的“Write Once从撼,Run Anywhere”的特性州弟,就是基于JVM才能夠實現(xiàn)的。那么我們就會好奇低零,為什么JVM會有這樣的功效呢婆翔?
而且在探索的過程中,我們發(fā)現(xiàn)掏婶,JVM不僅是涉及到了“Write Once啃奴,Run Anywhere”的特性,而且還涉及到了java程序的性能問題雄妥,于是我們發(fā)現(xiàn)最蕾,我們必須要去深入的了解一下JVM依溯。
正文
對JVM的研究,千頭萬緒瘟则,如果直接進入JVM的世界黎炉,我們可能還是不能真正的從整體上意識到JVM是什么東西,可能我們對JVM的細節(jié)有了足夠的認知醋拧,但是我們卻始終沒有把這個概念從整體上弄清楚慷嗜,沒有意識到JVM對于java的作用,在整個程序世界里面趁仙,如果不明白java為什么需要JVM洪添,那么我們也算不上真正的認識到JVM垦页。
而要認識清楚這一點雀费,我們要先弄清楚所謂的虛擬機是什么。
一. 虛擬機是什么痊焊?盏袄、
“虛擬機”是一個相對于“物理機”的概念,這兩種機器都有代碼執(zhí)行能力薄啥,其區(qū)別是物理機的執(zhí)行引擎是直接建立在處理器辕羽、緩存、指令集和操作系統(tǒng)層面上的垄惧,而虛擬機的執(zhí)行引擎則是由軟件自行實現(xiàn)的刁愿,因此可以不受物理條件制約地定制指令集與執(zhí)行引擎的結構關系,能夠執(zhí)行那些不被硬件直接支持的指令集格式到逊。
虛擬機铣口,簡單點理解就是將一臺電腦分配成多個具備完整計算機性能的系統(tǒng),當然觉壶,這些獨立的系統(tǒng)脑题,也就是我們所說的虛擬機了,它們都在共享這臺電腦的硬件資源铜靶。
這些虛擬機雖然是運行在同一臺電腦上面叔遂,但是每一臺虛擬機都有獨立的CMOS,硬盤和操作系統(tǒng)争剿。
從這里可以看出來已艰,虛擬機都有自己的獨立的環(huán)境,是隔絕了外界的蚕苇。說白了旗芬,虛擬機就像是獨立的一個王國,它可以設置屬于自己的規(guī)則捆蜀,而不會受到外界因素的影響疮丛。
二. java為什么需要java虛擬機幔嫂?
對于計算機硬件來說,不管是什么操作系統(tǒng)誊薄,計算機硬件只認識簡單的二進制語言履恩,但是不同的操作系統(tǒng)會有不同的編譯器來將我們的高級語言編譯為計算機硬件認識的二進制語言,那么就會出現(xiàn)一個問題呢蔫,比如一個“A”切心,windows操作系統(tǒng)編譯后的二進制是“0101”,但是蘋果操作系統(tǒng)編譯后的二進制卻是“1010”片吊,這樣就會出現(xiàn)各個操作系統(tǒng)不統(tǒng)一的問題绽昏。
而java要實現(xiàn)的,是“一次編譯俏脊,到處能用”的特性全谤,那么如果碰到了這樣的情況,基本上就是無法解決的爷贫。
于是认然,java決定了,要有自己的虛擬機漫萄,讓所有的平臺卷员,都有著相同的編譯方式,這樣腾务,不管在哪個操作系統(tǒng)毕骡,相同的java代碼,最后都有著相同的結果岩瘦。
那么未巫,JVM應運而生。
三. JVM做了什么担钮?
首先我們要知道橱赠,JVM,也就是java虛擬機箫津,它本身也是一個虛擬機狭姨,也就是說,它有著虛擬機的一切特性苏遥。它有著自己的獨立的環(huán)境饼拍,在這個環(huán)境中,它就是這個環(huán)境的王者田炭,它規(guī)定著這個環(huán)境的一切規(guī)則师抄。
那么,java虛擬機教硫,它規(guī)定了什么規(guī)則呢叨吮?
我們都知道辆布,一段java代碼,在經(jīng)過我們編譯打包后茶鉴,會變成一段class文件的字節(jié)碼锋玲,但字節(jié)碼并不能夠直接運行在操作系統(tǒng)之上,因為字節(jié)碼指令并非等價于本地機器指令涵叮,它內(nèi)部包含的僅僅只是一些能夠被 JVM 所識別的字節(jié)碼指令惭蹂、符號表,以及其他的輔助信息割粮。而JVM盾碗,則是規(guī)定了這段字節(jié)碼,會被轉譯成什么樣的二進制文件舀瓢,最后會運行出什么樣的結果廷雅。
那么,不管你是在windows程序上寫的java代碼氢伟,還是在蘋果系統(tǒng)上寫的java代碼榜轿,最后也不管你是在linux系統(tǒng)上運行這段java代碼幽歼,還是你在windows系統(tǒng)上運行java代碼朵锣,你都只需要編譯一次,當你把這一次編譯后的字節(jié)碼代碼甸私,在不同操作系統(tǒng)上的不同的JVM上運行的時候诚些,你最后獲取的結果都是一樣的,你都能得到你想要的結果皇型。這樣诬烹,所謂的群體化協(xié)作開發(fā)就能得到實現(xiàn),所有的java開發(fā)者們弃鸦,不管他們使用的是什么樣的電腦绞吁,最后都能開發(fā)同一個項目,為同一個結果進行開發(fā)唬格。
總的來說家破,JVM使用Java字節(jié)碼的方式,作為Java用戶語言和機器語言之間的中間語言购岗。實現(xiàn)一個通用的汰聋、和機器無關的執(zhí)行平臺。
也就是說喊积,JVM就是java程序運行的平臺烹困,是java語言底層實現(xiàn)的基礎。沒有JVM乾吻,java程序無法正常的運行髓梅,也無法有著“一次編譯拟蜻,到處執(zhí)行”的特性,等于是說枯饿,JVM是java霸業(yè)的奠基者瞭郑。
結束語
java基于要實現(xiàn)自己的特性,所以創(chuàng)造了JVM鸭你,而正是因為有了JVM屈张,java變成編程語言的霸主(原因之一),所以從某種程度上來講袱巨,現(xiàn)在的java阁谆,是由JVM“創(chuàng)造的”。
因此愉老,我們能深刻的理解到场绿,JVM和java之間深深的羈絆。
在程序語言發(fā)展的幾十年間嫉入,java屹立不倒焰盗,靠的當然也不僅僅是一個JVM,靠的是與時俱進咒林,不停的進步熬拒,因此java語言的版本變遷也一直在進行,從來沒有停止過垫竞。
但是JVM作為java語言的脊梁的這個事實澎粟,卻一直沒有改變。
所以欢瞪,如果想對java這門語言有著更加深刻的認知活烙,那么我們就必須把我們的注意力放到JVM上面來,必須要深刻的去研究一下JVM遣鼓,這樣我們才能深刻的了解到java從開發(fā)到編譯啸盏,再到運行的整個過程。
參考博客
因為這篇文章是我磨磨蹭蹭寫了好幾天才寫完骑祟,電腦關了又開好幾次回懦,所以參考了那些博客確實是不大記得了,如果有人發(fā)現(xiàn)了我的博客有哪些內(nèi)容是借鑒了您的博客曾我,請及時通知我粉怕,我會貼上您的博客地址的。