- N +

java虛擬機(jī)是一個(gè)解釋器(java虛擬機(jī)與平臺(tái)無關(guān))

大家好,感謝邀請(qǐng),今天來為大家分享一下java虛擬機(jī)是一個(gè)解釋器的問題,以及和java虛擬機(jī)與平臺(tái)無關(guān)的一些困惑,大家要是還不太明白的話,也沒有關(guān)系,因?yàn)榻酉聛韺榇蠹曳窒恚M梢詭椭酱蠹遥鉀Q大家的問題,下面就開始吧!

python虛擬機(jī)詳解

Python虛擬機(jī)是一種程序的虛擬機(jī),類似于Java虛擬機(jī),它可以執(zhí)行Python源代碼編譯后生成的字節(jié)碼。Python虛擬機(jī)的目的是提供一個(gè)和平臺(tái)無關(guān)的編程環(huán)境。

Python虛擬機(jī)的執(zhí)行過程大致如下:

Python先把代碼(.py文件)編譯成字節(jié)碼(.pyc文件),并封裝在PyCodeObject對(duì)象中,包含了字節(jié)碼指令以及程序的所有靜態(tài)信息。

Python虛擬機(jī)啟動(dòng),從PyCodeObject對(duì)象中一條一條讀取字節(jié)碼指令,并在當(dāng)前的上下文環(huán)境中執(zhí)行這條字節(jié)碼指令,從而完成程序的執(zhí)行。

Python虛擬機(jī)模擬了操作系統(tǒng)運(yùn)行可執(zhí)行文件的過程,利用棧幀(PyFrameObject對(duì)象)維護(hù)函數(shù)調(diào)用關(guān)系和執(zhí)行環(huán)境,包含了局部變量、名字空間、運(yùn)行時(shí)棧等動(dòng)態(tài)信息。

Python虛擬機(jī)在多個(gè)線程上切換,每個(gè)線程都對(duì)應(yīng)著一個(gè)棧幀,每個(gè)棧幀都維護(hù)了一個(gè)PyCodeObject對(duì)象。

Python虛擬機(jī)有多種實(shí)現(xiàn)方式,例如CPython、Jython、IronPython等,它們可能有不同的優(yōu)化策略和性能表現(xiàn)。

什么叫虛擬機(jī)

就是一臺(tái)虛擬的計(jì)算機(jī)。它是一款軟件,用來執(zhí)行一系列虛擬計(jì)算機(jī)指令。大體上,虛擬機(jī)可以分為系統(tǒng)虛擬機(jī)和程序虛擬機(jī)。

大名鼎鼎的VisualBox,Mware就屬于系統(tǒng)虛擬機(jī),它們完全是對(duì)物理計(jì)算機(jī)的仿真,提供了一個(gè)可運(yùn)行完整操作系統(tǒng)的軟件平臺(tái)。

程序虛擬機(jī)的典型代表就是Java虛擬機(jī),它專門為執(zhí)行單個(gè)計(jì)算機(jī)程序而設(shè)計(jì),在Java虛擬機(jī)中執(zhí)行的指令我們稱為Java字節(jié)碼指令。

無論是系統(tǒng)虛擬機(jī)還是程序虛擬機(jī),在上面運(yùn)行的軟件都被限制于虛擬機(jī)提供的資源中

作為一名程序員,了解java虛擬機(jī)類加載機(jī)制,有什么用

這是很重要的一門學(xué)問,剛好我昨天寫了篇文章,樓主可以物色物色。

Java類加載機(jī)制

Java中的類加載機(jī)制是java技術(shù)體系中算是比較核心的一部分,盡管我們平時(shí)接觸的并不是很多,而且類加載器也并不是和大部分軟件開發(fā)工作人員經(jīng)常打交道的。但是我們?cè)谶@里學(xué)習(xí)Java的累加器的背后的機(jī)制,能夠幫助我們理解并有助于排查程序中出現(xiàn)的類加載失敗等技術(shù)問題,就好比上篇文章的放射,學(xué)習(xí)了這些,你回頭看的時(shí)候就很容易理解啦。

為什么使用類加載

在我們學(xué)習(xí)的Java語言面里,類加載是當(dāng)我們的程序運(yùn)行的時(shí)候完成的,這樣的方式盡管會(huì)給類加載時(shí)候的主機(jī)稍微的添加點(diǎn)點(diǎn)的性能開銷以外,就是能給java程序提供高度的靈活性。

類加載的過程

我們?cè)谕瓿删帉懸?java為后綴的文件后,這些.java文件就會(huì)通過java中的編譯器編譯成后綴名字是.class的文件。我們走進(jìn).class文件之后,我們就可以看到這里面存儲(chǔ)著java代碼在編譯轉(zhuǎn)換后的虛擬指令。

當(dāng)我們準(zhǔn)備使用這個(gè)類的時(shí)候,jvm虛擬就就會(huì)加載它的.class文件,并且創(chuàng)建對(duì)應(yīng)的.class對(duì)象,我們將這種class文件加載到j(luò)vm虛擬機(jī)的內(nèi)存的這個(gè)過程稱之為類加載。

Loading(加載):加載就是我們把類的信息從文件中取得之后,再載入到JVM虛擬機(jī)的方法區(qū)/常量區(qū)里,也就是內(nèi)存里面。

Verifying(驗(yàn)證):在這行模塊我們會(huì)校驗(yàn)加載的結(jié)構(gòu)是不是符合Java語言規(guī)范和JVM規(guī)范的描述。在這個(gè)過程中,是類轉(zhuǎn)載的中最繁雜的一塊,在時(shí)間上的花費(fèi)也是最長(zhǎng)的一塊。我們使用的排錯(cuò)程序,有一大部分也是在檢查這一部分的錯(cuò)誤。

Preparing(準(zhǔn)備):檢驗(yàn)通過之后,我們會(huì)分配一種結(jié)構(gòu)去存儲(chǔ)類的信息,我們?cè)谶@個(gè)結(jié)構(gòu)中存儲(chǔ)了我們?cè)陬愔卸x的成員變量,方法和接口的數(shù)據(jù)信息。

Resolving(解析):解析就是我們把這個(gè)類中常量池中的所有的符號(hào)引用改變成直接引用。

Initializing(初始化):解析完成,我們就可以提取類中的變量,并且使之初始化成為合適的值。執(zhí)行靜態(tài)的初始化程序,可以把靜態(tài)變量初始化成指定的數(shù)值

在這里我們對(duì)加載要重點(diǎn)掌握,其余的過程至于要了解即可。

相對(duì)于其他階段,加載階段,也就是說獲取類的2進(jìn)制的字節(jié)流的這個(gè)階段,是我們?cè)诔绦蜷_發(fā)期可控性最強(qiáng)的一個(gè)階段。原因是,加載階段可以用我們系統(tǒng)提供的類加載器(ClassLoader)去獲取類的2進(jìn)制的字節(jié)流,當(dāng)然這個(gè)也可以由我們自定義的類加載器去獲取我們要的字節(jié)流。

當(dāng)我們的加載完成之后,jvm虛擬機(jī)外部的2進(jìn)制字節(jié)流就會(huì)按照jvm所需要的格式存儲(chǔ)在方法區(qū)中,其中的數(shù)據(jù)存儲(chǔ)格式都是由jvm自行定義實(shí)現(xiàn)。然后在Java的堆中實(shí)例化一個(gè)java.lang.Class類的對(duì)象,這個(gè)對(duì)象就是我們程序訪問方法區(qū)中的數(shù)據(jù)的外部接口。

這就是java中的類加載器,幫助到樓主的話,關(guān)注一下唄

感謝堅(jiān)持關(guān)注的朋友~

世界很大,幸好有你~

歡迎在評(píng)論區(qū)留下你的問題或困惑,我將每天與你分享我的觀點(diǎn)和心得。

聚焦最新科技咨訊,探尋未來智能領(lǐng)域,我是Mario女陶。

手機(jī)虛擬機(jī)是什么意思

手機(jī)虛擬機(jī)一般指的是java虛擬機(jī),因?yàn)槭謾C(jī)上的程序都是用java編寫的;而java程序都是在java虛擬機(jī)里運(yùn)行的;java虛擬機(jī)只是一個(gè)平臺(tái)而已,提供一種運(yùn)行環(huán)境。

java中,負(fù)責(zé)對(duì)字節(jié)代碼解釋執(zhí)行的是

拒絕冗長(zhǎng)回答,大道至簡(jiǎn)是這樣的我們?cè)诰帉慾ava的源代碼,會(huì)被javac轉(zhuǎn)換成字節(jié)碼文件(.class)在運(yùn)行時(shí)java虛擬機(jī)(JVM)內(nèi)嵌的解釋器將字節(jié)碼文件轉(zhuǎn)換成機(jī)器碼java源文件->class字節(jié)碼->機(jī)器碼

關(guān)于java虛擬機(jī)是一個(gè)解釋器的內(nèi)容到此結(jié)束,希望對(duì)大家有所幫助。

返回列表
上一篇:
下一篇: