JVM全稱是Java虛擬機(jī),在聊什么是JVM之前,我們不妨看?下這張圖。
從這張圖中可以看出JVM所處的位置,同時(shí)也能看出它兩個(gè)作用:
? ? 1、運(yùn)?并管理Java源碼?件所?成的Class?件,
? ? 2、在不同的操作系統(tǒng)上安裝不同的JVM,從?實(shí)現(xiàn)了跨平臺(tái)的保證。
?般情況下,對(duì)于開發(fā)者??,即使不熟悉JVM的運(yùn)?機(jī)制并不影響業(yè)務(wù)代碼的開發(fā),因?yàn)樵诎惭b完JDK或者JRE之后,其中就已經(jīng)內(nèi)置了JVM,所以只需要將Class?件交給JVM運(yùn)?即可。
但當(dāng)程序運(yùn)?的過程中出現(xiàn)了問題,?這個(gè)問題發(fā)生在JVM層?的,那我們就需要熟悉JVM的運(yùn)?機(jī)制,才能迅速排查并解決JVM的性能問題。
我們先看下目前主流的JVM HotSpot的架構(gòu)圖,通過這張架構(gòu)圖,我們可以看出JVM的大致流程是把一個(gè)class文件通過類加載器加載進(jìn)系統(tǒng),然后放到不同的區(qū)域,通過編譯器編譯。
第一個(gè)部分Class?Files
在Java中,Class?件是由源碼?件?成的,?于源碼?件的內(nèi)容,是每個(gè)Java開發(fā)者在JavaSE階段的必備知識(shí),這?就不再贅述了,我們可以關(guān)注?下Class?件的格式,?如其中的常量池、成員變量、?法等,這樣就能知道Java源碼內(nèi)容在Class?件中的表示?式
第二個(gè)部分Class?Loader?Subsystem即類加載機(jī)制
Class?件加載到內(nèi)存中,需要借助Java中的類加載機(jī)制。類加載機(jī)制分為裝載、鏈接和初始化,其主要就是對(duì)類進(jìn)?查找、驗(yàn)證以及分配相關(guān)的內(nèi)存空間和賦值
第三個(gè)部分Runtime?Data?Areas也就是通常所說的運(yùn)?時(shí)數(shù)據(jù)區(qū)
其解決的問題就是Class?件進(jìn)入內(nèi)存之后,該如何進(jìn)?存儲(chǔ)不同的數(shù)據(jù)以及數(shù)據(jù)該如何進(jìn)?扭轉(zhuǎn)。比如:Method ??Area通常會(huì)儲(chǔ)存由Class?件常量池所對(duì)應(yīng)的運(yùn)?時(shí)常量池、字段和?法的元數(shù)據(jù)信息、類的模板信息等;Heap是存儲(chǔ)各種Java中的對(duì)象實(shí)例;Java?Threads通過線程以棧的?式運(yùn)?加載各個(gè)?法;Native?Internal?Thread可以理解為是加載運(yùn)?native類型的?法;PC ??Register則是保存每個(gè)線程執(zhí)??法的實(shí)時(shí)地址。
這樣通過運(yùn)?時(shí)數(shù)據(jù)區(qū)的5個(gè)部分就能很好地把數(shù)據(jù)存儲(chǔ)和運(yùn)?起來了
第四個(gè)部分Garbage?Collector也就是通常所說的垃圾回收
就是對(duì)運(yùn)?時(shí)數(shù)據(jù)區(qū)中的數(shù)據(jù)進(jìn)?管理和回收?;厥諜C(jī)制可以基于不同的垃圾收集器,?如Serial、Parallel、CMS、G1、ZGC等,可以針對(duì)不同的業(yè)務(wù)場(chǎng)景選擇不同的收集器,只需要通過JVM參數(shù)設(shè)置即可。如果我們打開hotspot的源碼,可以發(fā)現(xiàn)這些收集器其實(shí)就是對(duì)于不同垃圾收集算法的實(shí)現(xiàn),核?的算法有3個(gè):標(biāo)記-清除、標(biāo)記-整理、復(fù)制
第五個(gè)部分是JIT?Compiler和Interpreter
通俗理解就是翻譯器,Class的字節(jié)碼指令通過JIT Compiler和Interpreter翻譯成對(duì)應(yīng)操作系統(tǒng)的CPU指令,只不過可以選擇解釋執(zhí)?或者編譯執(zhí)?,在HotSpot JVM默認(rèn)采用的是這兩種?式的混合。
第六就是JNI的技術(shù)
如果我們想要找Java中的某個(gè)native?法是如何通過C或者C++實(shí)現(xiàn)的,那么可以通過Native?Method?Interface來進(jìn)?查找,也就是所謂的JNI技術(shù)。
通過官?上給出的HotSpot架構(gòu)圖,我們就能夠知道JVM到底是如何運(yùn)行的了,當(dāng)然在實(shí)際操作的過程中我們可以借助?些JVM參數(shù):例如:
和?些常?的JDK常?命令
再結(jié)合JDK常??具以及第三?的?些?具
文章來源:http://www.zghlxwxcb.cn/news/detail-732518.html
我們就可以優(yōu)雅地分析JVM出現(xiàn)的常?問題并對(duì)其進(jìn)?調(diào)優(yōu)。文章來源地址http://www.zghlxwxcb.cn/news/detail-732518.html
到了這里,關(guān)于大廠面試題-什么是JVM的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!