1.什么是JVM
JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫纯衍,是JRE的一部分。它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī)再榄,是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的狡刘。JVM有自己完善的硬件架構(gòu),如處理器困鸥、堆棧嗅蔬、寄存器等,還具有相應(yīng)的指令系統(tǒng)
2.JDK,JRE,JVM關(guān)系
- JDK(Java Development Kit Java開發(fā)工具包),JDK是提供給Java開發(fā)人員使用的购城,其中包含了java的開發(fā)工具吕座,也包括了JRE。所以安裝了JDK瘪板,就不用在單獨(dú)安裝JRE了吴趴。其中的開發(fā)工具包括編譯工具(javac.exe) 打包工具(jar.exe)等
- JRE(Java Runtime Environment Java運(yùn)行環(huán)境) 是 JDK 的子集,也就是包括 JRE 所有內(nèi)容侮攀,以及開發(fā)應(yīng)用程序所需的編譯器和調(diào)試器等工具锣枝。JRE 提供了庫(kù)、Java 虛擬機(jī)(JVM)和其他組件兰英,用于運(yùn)行 Java 編程語(yǔ)言撇叁、小程序、應(yīng)用程序
- JVM(Java Virtual Machine Java虛擬機(jī))畦贸,JVM可以理解為是一個(gè)虛擬出來(lái)的計(jì)算機(jī)陨闹,具備著計(jì)算機(jī)的基本運(yùn)算方式,它主要負(fù)責(zé)把 Java 程序生成的字節(jié)碼文件薄坏,解釋成具體系統(tǒng)平臺(tái)上的機(jī)器指令趋厉,讓其在各個(gè)平臺(tái)運(yùn)行
3.Java是怎么實(shí)現(xiàn)它的跨平臺(tái)特性的
系統(tǒng)軟件無(wú)法通用是一個(gè)常見的問題。但使用過 Java 的同學(xué)都知道胶坠,Java 代碼可以在服務(wù)端(Linux 系統(tǒng))運(yùn)行君账,也可以在 Windows 系統(tǒng)運(yùn)行,但我們并沒有生成多份不同的代碼沈善。所以 Java 語(yǔ)言是如何做到的呢?
我們都知道在 Windows 系統(tǒng)上一個(gè)軟件包裝包是 exe 后綴的乡数,而這個(gè)軟件包在蘋果的 Mac OSX 系統(tǒng)上是無(wú)法安裝的。類似地闻牡,Mac OSX 系統(tǒng)上軟件安裝包則是 dmg 后綴净赴,同樣無(wú)法在 Windows 系統(tǒng)上安裝
為什么不同系統(tǒng)上的軟件無(wú)法安裝,這是因?yàn)椴僮飨到y(tǒng)底層的實(shí)現(xiàn)是不一樣的罩润。對(duì)于 Windows 系統(tǒng)來(lái)說玖翅,exe 后綴的軟件代碼最終編譯成 Windows 系統(tǒng)能識(shí)別的機(jī)器碼。而 Mac OSX 系統(tǒng)來(lái)說哨啃,dmg 后綴的軟件代碼最終編譯成 Mac OSX 系統(tǒng)能識(shí)別的代碼
與其他語(yǔ)言不同烧栋,Java 語(yǔ)言并不直接將代碼編譯成與系統(tǒng)有關(guān)的機(jī)器碼,而是編譯成一種特定的語(yǔ)言規(guī)范拳球,這種語(yǔ)言規(guī)范我們稱之為字節(jié)碼审姓。無(wú)論 Java 程序要在 Windows 系統(tǒng),還是 Mac OSX 系統(tǒng)祝峻,抑或是 Linux 系統(tǒng)魔吐,它首先都得編譯成字節(jié)碼文件扎筒,之后才能運(yùn)行
但即使編譯成字節(jié)碼文件了,各個(gè)系統(tǒng)還是無(wú)法明白字節(jié)碼文件的內(nèi)容酬姆,這時(shí)候就需要 Java 虛擬機(jī)的幫助了嗜桌。Java 虛擬機(jī)會(huì)解析字節(jié)碼文件的內(nèi)容,并將其翻譯為各操作系統(tǒng)能理解的機(jī)器碼
簡(jiǎn)單地說辞色,對(duì)于同樣一份 Java 源碼文件骨宠,我們編譯成字節(jié)碼之后,無(wú)論是 Linux 系統(tǒng)還是 Windows 系統(tǒng)都不認(rèn)識(shí)相满。這時(shí)候JVM就是一個(gè)翻譯官层亿,在 Linux 系統(tǒng)上翻譯成 Linux 機(jī)器碼給 Linux 系統(tǒng)聽,在 Windows 系統(tǒng)上翻譯成 Windows 機(jī)器碼給 Windows 系統(tǒng)聽立美。這樣一來(lái)匿又,Java 就實(shí)現(xiàn)了「Write Once,Run Anywhere」的偉大愿景了
總結(jié):
Java程序的跨平臺(tái)特性主要是指字節(jié)碼文件可以在任何具有JVM的計(jì)算機(jī)或者電子設(shè)備上運(yùn)行建蹄,Java虛擬機(jī)中的Java解釋器負(fù)責(zé)將字節(jié)碼文件解釋成為特定的機(jī)器碼進(jìn)行運(yùn)行碌更。因此在運(yùn)行時(shí),Java源程序需要通過編譯器編譯成為.class文件洞慎。眾所周知java.exe是java class文件的執(zhí)行程序痛单,但實(shí)際上java.exe程序只是一個(gè)執(zhí)行的外殼,它會(huì)裝載jvm.dll(windows下拢蛋,下皆以windows平臺(tái)為例桦他,linux下為:libjvm.so)蔫巩,這個(gè)動(dòng)態(tài)連接庫(kù)才是java虛擬機(jī)的實(shí)際操作處理所在
4.JVM的位置
- 這部分是整個(gè) Java 實(shí)現(xiàn)跨平臺(tái)的最核心內(nèi)容谆棱,由 Java 程序編譯成的 .class 文件會(huì)在虛擬機(jī)上執(zhí)行
- 另外在 JVM 解釋 class 文件時(shí)需要調(diào)用類庫(kù) lib。在 JRE 目錄下有兩個(gè)文件夾 lib圆仔、bin垃瞧,而 lib 就是 JVM 執(zhí)行所需要的類庫(kù)
- jvm.dll 并不能獨(dú)立工作,當(dāng) jvm.dll 啟動(dòng)后坪郭,會(huì)使用 explicit 方法來(lái)載入輔助動(dòng)態(tài)鏈接庫(kù)一起執(zhí)行
下一篇:
JVM第二篇:JVM構(gòu)成
相關(guān)文章:
JDK个从、JRE、JVM歪沃,是什么關(guān)系嗦锐?
JVM是什么