很多Java開發(fā)人員,還不清楚JVM是什么,就直接涉足JVM調(diào)優(yōu)。
很多Java開發(fā)人員,說起JVM,只知道運(yùn)行時(shí)數(shù)據(jù)區(qū)域(或稱之為JVM內(nèi)存布局或JVM內(nèi)存結(jié)構(gòu))。
還有很多Java開發(fā)人員,在被問起:“你知道Java內(nèi)存模型嗎?”,答:“知道,Java內(nèi)存模型分為方法區(qū)、堆、...”。
......
雖說“概念”這個(gè)詞發(fā)明出來是為了方便交流和說明問題的,不用太過于較真。但是,答非所問就是你的不對(duì)了。
如果你屬于其中一者,我勸你看完這篇文章。
本文就一個(gè)目的:認(rèn)識(shí)JVM。
認(rèn)識(shí)JVM應(yīng)該從哪里入手?
可以問自己幾個(gè)問題,為什么有JVM?沒有JVM會(huì)怎樣?
Java編程語言設(shè)計(jì)的初衷就是要解決一個(gè)問題:程序員編寫一次程序,可以在任何提供Java運(yùn)行時(shí)環(huán)境的機(jī)器上運(yùn)行。
也就是Java語言的跨平臺(tái)特性“一次編寫,到處運(yùn)行”。
這一點(diǎn)可以在官方提供的文檔里證實(shí):
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html
可能有些Java開發(fā)人員對(duì)跨平臺(tái)特性不是很理解:“不應(yīng)該就是編寫一次到處運(yùn)行嗎?”。
當(dāng)然不是,如果了解C、C++語言的,就知道,想要在不同平臺(tái)上運(yùn)行,需要分別編譯,甚至重新編寫。
當(dāng)然,這是所有編程語言都存在的問題。原因下面有說明。
那么,Java是如何解決的?
Java之所以能實(shí)現(xiàn)跨平臺(tái),離不開JVM的支持。
下面對(duì)此展開說明。
JVM,全稱:Java Virtual Machine (Java 虛擬機(jī))。
下面是官方對(duì)JVM的定義:
Java虛擬機(jī)是一種抽象的計(jì)算機(jī)。就像真正的計(jì)算機(jī)一樣,它有一個(gè)指令集,并在運(yùn)行時(shí)處理各種內(nèi)存區(qū)域。
這個(gè)說明已經(jīng)非常簡單明了了。如果不理解的繼續(xù)看下文。
任何一個(gè)高級(jí)編程語言編寫的程序,在最終執(zhí)行前,都會(huì)被翻譯成計(jì)算機(jī)可以理解的語言:機(jī)器碼,也就是諸如0101的二進(jìn)制數(shù)。
圖片
這些機(jī)器碼就是指令的實(shí)際表示,計(jì)算機(jī)的工作原理就是通過執(zhí)行這些指令來完成具體的任務(wù)。
(每一條指令中明確規(guī)定了計(jì)算機(jī)從哪個(gè)地址取數(shù),進(jìn)行什么操作,然后送到什么地址去等步驟)
而同一個(gè)操作,在不同的平臺(tái),指令可能會(huì)有所不同。
例如,“將數(shù)據(jù)從內(nèi)存加載到寄存器”的操作,在x86架構(gòu)和ARM架構(gòu)中,指令就不一樣:
MOV EAX, [0x12345678]
LDR R0, [0x12345678]
所以,在一個(gè)平臺(tái)上編寫的程序要在其他平臺(tái)上運(yùn)行,就需要重新編譯,甚至重寫。否則就會(huì)出現(xiàn)下圖現(xiàn)象。
圖片
這也正是跨平臺(tái)問題存在的根本原因。
而JVM作為一個(gè)抽象的計(jì)算機(jī),對(duì)外提供了一套自己的指令集,作用何在?
JVM指令集作用是:在不同平臺(tái)運(yùn)行符合自己指令的程序時(shí),會(huì)將該指令轉(zhuǎn)換成當(dāng)前機(jī)器的本地指令。
這樣就避免了多次編譯的操作,從而實(shí)現(xiàn)“一次編寫,到處運(yùn)行”。
或者這樣理解:JVM替代了多次編譯的工作。
那么,“符合自己指令的程序”是什么呢?
沒錯(cuò),就是Java字節(jié)碼(class文件)。
我們平時(shí)在編寫完.java源碼后,會(huì)經(jīng)過JDK提供的編譯工具(javac)編譯為.class,而.class文件里面的內(nèi)容就是JVM指令。
圖片
可能會(huì)有人有疑問,“為什么javac不直接編譯成機(jī)器碼?”
三個(gè)方面回答這個(gè)問題:
圖片
通過上面的描述,如果理解了JVM是什么、JVM的作用或者JVM存在的意義,那就算是入門了。
如果激發(fā)了你對(duì)“JVM指令是什么”以及“它們?nèi)绾伪晦D(zhuǎn)換成機(jī)器指令”的好奇心,或者產(chǎn)生“類加載和JVM的關(guān)系”、“垃圾回收器和JVM的關(guān)系”等疑問。
那么,請關(guān)注我,后面的文章會(huì)帶你一起了解。或者,自己可以去官方進(jìn)行了解,官方文檔鏈接給你放在這。
Java 各版本文檔:
https://docs.oracle.com/en/java/javase/
Java語言&JVM規(guī)范文檔:
https://docs.oracle.com/javase/specs/index.html
最后總結(jié)一下本文內(nèi)容:
當(dāng)了解了JVM的作用、存在的意義,再去了解JVM的工作原理就不會(huì)那么困惑了。
本文鏈接:http://www.tebozhan.com/showinfo-26-87960-0.html這是一篇給Java初學(xué)者看的JVM文章
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 總結(jié)CSS中各個(gè)屬性使用百分比(%)基準(zhǔn)值
下一篇: 騰訊互娛面經(jīng)詳解