国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

慈溪外貿(mào)公司網(wǎng)站優(yōu)化營(yíng)商環(huán)境的意義

慈溪外貿(mào)公司網(wǎng)站,優(yōu)化營(yíng)商環(huán)境的意義,天潤(rùn)網(wǎng)站建設(shè),網(wǎng)絡(luò)工程專(zhuān)業(yè)主要學(xué)什么JVM的語(yǔ)言無(wú)關(guān)性 與平臺(tái)無(wú)關(guān)性是建立在操作系統(tǒng)上,虛擬機(jī)廠(chǎng)商提供了許多可以運(yùn)行在各種不同平臺(tái)的虛擬機(jī)。它們都可以載入和執(zhí)行字節(jié)碼,從而實(shí)現(xiàn)程序的”一次編寫(xiě),到處運(yùn)行”。 各種不同平臺(tái)的虛擬機(jī)與平臺(tái)都統(tǒng)一使用的程序存儲(chǔ)格式——字節(jié)…

?

JVM的語(yǔ)言無(wú)關(guān)性

與平臺(tái)無(wú)關(guān)性是建立在操作系統(tǒng)上,虛擬機(jī)廠(chǎng)商提供了許多可以運(yùn)行在各種不同平臺(tái)的虛擬機(jī)。它們都可以載入和執(zhí)行字節(jié)碼,從而實(shí)現(xiàn)程序的”一次編寫(xiě),到處運(yùn)行”。

各種不同平臺(tái)的虛擬機(jī)與平臺(tái)都統(tǒng)一使用的程序存儲(chǔ)格式——字節(jié)碼(ByteCode)是構(gòu)成平臺(tái)無(wú)關(guān)性的基石,也是語(yǔ)言無(wú)關(guān)性的基礎(chǔ)。Java虛擬機(jī)不和包括java在內(nèi)的任何語(yǔ)言綁定,它只與”Class文件”這種特定的二進(jìn)制文件格式所關(guān)聯(lián)。Class文件中包含了Java虛擬機(jī)指集合符號(hào)以及若干其他輔助信息。

image.png

Class文件的衍變過(guò)程與所處位置

image.png

Java技術(shù)能一直保持非常好的向后兼容性,這點(diǎn)Class文件結(jié)構(gòu)的穩(wěn)定性功不可沒(méi)。Java已經(jīng)發(fā)展到14版本,但是class文件結(jié)構(gòu)的內(nèi)存,絕大部分在JDK1.2的時(shí)候就已經(jīng)定義好了。雖然JDK1.2的內(nèi)容比較古老,但是java發(fā)展經(jīng)歷了十余個(gè)大版本,但是每次基本上只是在原本結(jié)構(gòu)基礎(chǔ)上新增內(nèi)容,擴(kuò)充功能,并未定義的內(nèi)容做修改。

任何一個(gè)Class文件都對(duì)應(yīng)著唯一一個(gè)類(lèi)或者接口的定義信息,但反過(guò)來(lái)說(shuō),Class文件實(shí)際上它并不一定以磁盤(pán)文件的形式存在(比如可以動(dòng)態(tài)生成,或者直接送入類(lèi)加載器中)。Class文件是一組以8位字節(jié)為基礎(chǔ)單位的二進(jìn)制流。

Class文件結(jié)構(gòu)這些內(nèi)容在面試的時(shí)候較少,但是身為資深java開(kāi)發(fā),我們必須去了解它。

Class文件格式

現(xiàn)在我們知道了Class文件存在的意義,以及在整個(gè)java運(yùn)行流程所處的位置了。那么,這個(gè)平時(shí)我們很少關(guān)心的Class文件結(jié)構(gòu)的結(jié)構(gòu)是什么呢?

下面,我們從一段代碼入手,看看它對(duì)應(yīng)的的Class文件的"廬山真面目"。

image.png

首先,先給出一個(gè)簡(jiǎn)單的java程序,并對(duì)其進(jìn)行編譯。找到其編譯好的Class文件地址。

image.png

image.png

以上是我們用16進(jìn)制打開(kāi)的class文件結(jié)構(gòu)圖。文件通過(guò)二進(jìn)制存儲(chǔ),以8個(gè)字節(jié)為一組,所以以16進(jìn)制展示。

各個(gè)數(shù)據(jù)項(xiàng)目嚴(yán)格按照順序緊湊地排列在Class文件之中,中間沒(méi)有添加任何分隔符,這使得整個(gè)Class文件中存儲(chǔ)的內(nèi)容幾乎全部都是程序運(yùn)行的必要參數(shù),沒(méi)有空隙存在。

Class文件格式采用一種類(lèi)似C語(yǔ)言結(jié)構(gòu)體的偽結(jié)構(gòu)來(lái)存數(shù)據(jù),這種偽結(jié)構(gòu)只有兩種數(shù)據(jù)類(lèi)型:無(wú)符號(hào)數(shù)和表。

無(wú)符號(hào)數(shù)屬于基本數(shù)據(jù)類(lèi)型,以u(píng)1,u2,u4,u8來(lái)分別代表1個(gè)字節(jié)(一個(gè)字節(jié)是由兩位16進(jìn)制數(shù)組成。例如cafe babe:c是一個(gè)16進(jìn)制,a是一個(gè)16進(jìn)制等等。ca組成了一個(gè)字節(jié)),2個(gè)字節(jié),4個(gè)字節(jié),8個(gè)字節(jié)的無(wú)符號(hào)數(shù),無(wú)符號(hào)數(shù)可以用來(lái)描述數(shù)字,索引引用,數(shù)量值或者按照UTF-8編碼構(gòu)成字符串值。

表是由多個(gè)無(wú)符號(hào)數(shù)或者其他表作為數(shù)據(jù)項(xiàng)構(gòu)成的復(fù)合數(shù)據(jù)類(lèi)型。對(duì)應(yīng)關(guān)系可參照下圖

image.png

所有表都習(xí)慣性地以”_info”結(jié)尾,也就是被兩個(gè)"_info"包圍就可以認(rèn)為是一張表的數(shù)據(jù)。表用于描述有層次關(guān)系的復(fù)合結(jié)構(gòu)的數(shù)據(jù),整個(gè)Class文件本質(zhì)上就是一張一張的表組合而成的。

Class文件格式細(xì)節(jié)分析

Class文件的結(jié)構(gòu)不像XML等描述語(yǔ)言。由于它沒(méi)有任何分隔符號(hào),所以在其中的數(shù)據(jù)項(xiàng),無(wú)論是順序還是數(shù)量,都被嚴(yán)格限制。哪個(gè)字節(jié)代表了什么含義,長(zhǎng)度是多少,先后順序如何,都不允許改變。按順序包括:

魔數(shù)

image.png

每個(gè)Class文件的頭4個(gè)字節(jié)(U4)稱(chēng)為魔數(shù)(Magic Number),它的唯一作用是確定這個(gè)文件是否為一個(gè)能被虛擬機(jī)接受的Class文件。使用魔數(shù)而不是擴(kuò)展名(擴(kuò)展名.java ?擴(kuò)展名.class ?擴(kuò)展名.jar)進(jìn)行識(shí)別主要基于安全方面的考慮。因?yàn)閿U(kuò)展名可以隨意地改動(dòng)。(言外之意就是cafe babe是證明這是class文件的唯一標(biāo)志)。

版本

緊接著的四個(gè)字節(jié),第一個(gè)U2(第5,6個(gè)字節(jié))是次版本號(hào)(MinorVersion),第二個(gè)U2(第7,8個(gè)字節(jié))是主版本號(hào)(MajorVersion)。Java的版本是從45開(kāi)始記起。JDK1.1之后每個(gè)JDK大版本發(fā)布主版本號(hào)向上+1,高版本能向下兼容以前舊版本的Class文件,但不能運(yùn)行以后版本的Class文件,即使文件格式未發(fā)生任何變化,虛擬機(jī)也必須拒絕執(zhí)行超過(guò)其版本號(hào)的Class文件。image.png就代表著JDK1.8(16進(jìn)制的34,換成10進(jìn)制就是52 ??JDK1.1---45 ??JDK1.8---52)。

常量池

常量池中常量的數(shù)量是不固定的,所以在常量池的入口需要放置一項(xiàng)u2類(lèi)型的數(shù)據(jù),代表常量池容量計(jì)數(shù)值(constant_pool_count)。與Java習(xí)慣不一樣的是,這個(gè)容量計(jì)數(shù)器是從1而不是從0開(kāi)始的。也就是1代表的是無(wú)常量,2才是有一個(gè)。0可以表示某些指向常量池的索引值的數(shù)據(jù)在特定情況下需要表達(dá)”不引用任何一個(gè)常量池項(xiàng)目”的含義。

由圖可知,此處的16,實(shí)際值為16-1=15個(gè)。

image.png

使用Javap -v 反編譯結(jié)果

常量池共15個(gè)數(shù)據(jù)。

常量池中每一種類(lèi)型的常量都是一張表。目前截止至JDK13,常量表中分別有17中不同類(lèi)型的常量。

常量池中主要存放兩大類(lèi)常量:字面量(Literal)和符號(hào)引用(Symbolic References)。

字面量比較接近于Java語(yǔ)言中的常量的概念,比如字符串,聲明為final的常量值等。

我們用Jclasslib工具反編譯這個(gè)Class文件,查看一下常量池中的數(shù)據(jù)。

image.png

再提符號(hào)引用

我們知道,當(dāng)我們的程序在運(yùn)行中時(shí),我們堆中的對(duì)象要調(diào)用方法,是通過(guò)對(duì)象頭中存儲(chǔ)的類(lèi)型指針,通過(guò)直接引用,找到具體方法在方法區(qū)中的地址。

那么,在類(lèi)加載過(guò)程中,我們需要把Class文件加載到我們運(yùn)行時(shí)數(shù)據(jù)區(qū),就需要用到我們的符號(hào)引用了。了解了符號(hào)引用的概念,那么具體符號(hào)引用中有哪些細(xì)節(jié)幫助我們尋找地址呢?

符號(hào)引用包含類(lèi)和接口的全限定名(Fully Qualified Name),字段的名稱(chēng)和描述符(Descriptor),方法的名稱(chēng)和描述符。

訪(fǎng)問(wèn)標(biāo)志(識(shí)別類(lèi)是什么關(guān)鍵字修飾的)

用于識(shí)別一些類(lèi)或者接口層次的訪(fǎng)問(wèn)信息,包括:這個(gè)Class是類(lèi)還是接口:是否定義為public類(lèi)型,是否定義為abstract類(lèi)型:如果是類(lèi)的話(huà),是否被聲明成final等。識(shí)別類(lèi)的修飾符

類(lèi)索引,父類(lèi)索引與接口索引集合

這三項(xiàng)數(shù)據(jù)來(lái)確定這個(gè)類(lèi)的繼承關(guān)系。

類(lèi)索引用于確定這個(gè)類(lèi)的全限定名,父類(lèi)索引用于確定這個(gè)類(lèi)的父類(lèi)的全限定名。由于Java語(yǔ)言不允許多重繼承,所以父類(lèi)索引只有一個(gè),除了java.lang.Object之外,所有的類(lèi)都有父類(lèi)。因此除了java.lang.Object之外,所有Java類(lèi)的父類(lèi)索引都不為0.接口索引集合就用來(lái)描述這個(gè)這個(gè)類(lèi)實(shí)現(xiàn)了哪些接口,這些被實(shí)現(xiàn)的接口按implements語(yǔ)句(如果這個(gè)類(lèi)本身是一個(gè)接口,則應(yīng)當(dāng)是extends語(yǔ)句)后續(xù)的接口順序從左到右排列在這個(gè)接口索引集合中。

字段表集合

描述接口或者類(lèi)中聲明的變量,字段(field)包括類(lèi)級(jí)變量(全局級(jí)變量或靜態(tài)變量,需要使用static關(guān)鍵字修飾)以及實(shí)例級(jí)變量(成員變量,實(shí)例化后才會(huì)分配內(nèi)存空間,才能訪(fǎng)問(wèn))。

字段可以包括的修飾符有字段作用域(public,privbate,protected)。是成員還是類(lèi)變量(static),是否可變(final),并發(fā)可見(jiàn)性(volatile),是否可被序列化(transient)。這些信息在字段表中都是布爾值形式存在的。有這個(gè)修飾符就是1,沒(méi)有就是0。

而字段叫什么名字,字段被定義成什么數(shù)據(jù)類(lèi)型,這些都是無(wú)法固定的。所以只能引用常量池中的常量來(lái)描述。

字段表集合中不會(huì)列出從超類(lèi)或者父接口中繼承而來(lái)的字段,但有可能列出原本Java代碼之中不存在的字段。譬如在內(nèi)部類(lèi)中為了保持對(duì)外部類(lèi)的訪(fǎng)問(wèn)性,會(huì)自動(dòng)添加指向外部類(lèi)實(shí)例的字段。

方法表集合

Class文件存儲(chǔ)格式中對(duì)方法的描述與字段的描述幾乎采用了完全一致的方式。方法表的結(jié)構(gòu)如同字段表一樣。一次包括訪(fǎng)問(wèn)標(biāo)志,名稱(chēng)索引,描述符索引,屬性集合表幾項(xiàng)。

描述了方法的定義,但是方法里的Java代碼,經(jīng)過(guò)編譯器編譯成字節(jié)碼指令之后,存放在屬性表集合中的方法屬性表集合中一個(gè)名為”Code”的屬性里面。與字段表集合是類(lèi)似的。如果父類(lèi)方法在子類(lèi)中沒(méi)有被重寫(xiě)(Override),方法集中就不會(huì)出現(xiàn)來(lái)自父類(lèi)的方法信息。但同樣的,有可能會(huì)出現(xiàn)由編譯器自動(dòng)添加的方法,最典型的便是類(lèi)構(gòu)造器”<client>”方法和實(shí)例構(gòu)造器<”init”>

屬性表集合

存儲(chǔ)Class文件,字段表,方發(fā)表都又自己的屬性表集合,用于描述某些場(chǎng)景專(zhuān)有的信息。比如方法的代碼就存儲(chǔ)在Code屬性表中。

字節(jié)碼指令

字節(jié)碼指令

字節(jié)碼指令屬于方法表中的內(nèi)容。

image.png

image.png

Java 虛擬機(jī)的指令由一個(gè)字節(jié)長(zhǎng)度的、代表著某種特定操作含義的數(shù)字(稱(chēng)為操作碼,Opcode)以及跟隨其后的零至多個(gè)代表此操作所需參數(shù)(稱(chēng)為操作數(shù),Operands)而構(gòu)成。

由于限制了 Java 虛擬機(jī)操作碼的長(zhǎng)度為一個(gè)字節(jié)(即 0~255),這意味著指令集的操作碼總數(shù)不可能超過(guò) 256 條。

大多數(shù)的指令都包含了其操作所對(duì)應(yīng)的數(shù)據(jù)類(lèi)型信息。例如:

iload 指令用于從局部變量表中加載 int 型的數(shù)據(jù)到操作數(shù)棧中,而 fload 指令加載的則是 float 類(lèi)型的數(shù)據(jù)(此處未列舉)。

大部分的指令都沒(méi)有支持整數(shù)類(lèi)型 byte、char 和 short,甚至沒(méi)有任何指令支持 boolean 類(lèi)型。大多數(shù)對(duì)于 boolean、byte、short 和 char 類(lèi)型數(shù)據(jù)的操作,實(shí)際上都是使用相應(yīng)的 int 類(lèi)型作為運(yùn)算類(lèi)型

閱讀字節(jié)碼作為了解 Java 虛擬機(jī)的基礎(chǔ)技能,有需要的話(huà)可以去掌握常見(jiàn)指令。

字節(jié)碼助記碼解釋地址:https://cloud.tencent.com/developer/article/1333540

?

http://aloenet.com.cn/news/36623.html

相關(guān)文章:

  • 動(dòng)態(tài)網(wǎng)站建設(shè)04章在線(xiàn)測(cè)試關(guān)鍵詞排名優(yōu)化易下拉霸屏
  • 北京12345網(wǎng)上投訴平臺(tái)seo搜索引擎優(yōu)化報(bào)價(jià)
  • 免費(fèi)政府網(wǎng)站html模板百度首頁(yè)快速排名系統(tǒng)
  • 廣西建設(shè)廳網(wǎng)站是什么關(guān)鍵詞優(yōu)化需要從哪些方面開(kāi)展?
  • 宣武網(wǎng)站建設(shè)低價(jià)刷贊網(wǎng)站推廣
  • 網(wǎng)站域名綁定seo搜索優(yōu)化專(zhuān)員招聘
  • 免費(fèi)網(wǎng)絡(luò)翻外墻軟件寧波seo高級(jí)方法
  • 濰坊哪里能找到做網(wǎng)站的seo廣告平臺(tái)
  • 網(wǎng)站建設(shè)服務(wù)提供商搜索引擎排名
  • 網(wǎng)站做的好不好看什么廣州seo
  • 做站群一個(gè)網(wǎng)站多少錢(qián)網(wǎng)站建設(shè)的整體流程有哪些
  • 怎樣克隆別人的網(wǎng)站上海百度推廣優(yōu)化排名
  • 阿里巴巴網(wǎng)站更新怎么做百度競(jìng)價(jià)優(yōu)化
  • h5商城網(wǎng)站怎么做的河北seo平臺(tái)
  • 網(wǎng)站評(píng)論源碼制作網(wǎng)站的步驟和過(guò)程
  • 網(wǎng)站建設(shè)移動(dòng)端是什么意思百青藤?gòu)V告聯(lián)盟
  • 東莞網(wǎng)站優(yōu)化方案鄭州seo聯(lián)系搜點(diǎn)網(wǎng)絡(luò)效果好
  • 網(wǎng)站優(yōu)化建設(shè)上海西安網(wǎng)頁(yè)設(shè)計(jì)
  • 2023b站免費(fèi)推廣網(wǎng)seo是怎么優(yōu)化上去
  • 網(wǎng)站建設(shè)公司做前端廣告代運(yùn)營(yíng)
  • 一件代發(fā)幫做網(wǎng)站的騙局百度關(guān)鍵詞搜索量
  • android開(kāi)發(fā)app西安seo搜推寶
  • 怎么做移動(dòng)網(wǎng)站seo外包公司哪家好
  • 優(yōu)質(zhì)的seo網(wǎng)站排名優(yōu)化軟件下載安裝百度
  • 國(guó)際疫情最新消息惠州seo優(yōu)化服務(wù)
  • 愛(ài)站seo查詢(xún)軟件推廣平臺(tái) 賺傭金
  • 網(wǎng)站開(kāi)發(fā)還是做數(shù)據(jù)庫(kù)開(kāi)發(fā)代理公司注冊(cè)
  • 網(wǎng)站改標(biāo)題不改版 k網(wǎng)絡(luò)推廣技術(shù)外包
  • 建網(wǎng)站的資料網(wǎng)上營(yíng)銷(xiāo)推廣
  • 西地那非片能延時(shí)多久seo優(yōu)化服務(wù)商