上節(jié)學(xué)習(xí)回顧
在上一節(jié)當(dāng)中,主要以自己的工作環(huán)境簡單地介紹了一下自身的一些調(diào)優(yōu)或者說是故障處理經(jīng)驗(yàn)。所謂百變不離其宗,這個(gè)宗就是我們解決問題的思路了。
本節(jié)學(xué)習(xí)重點(diǎn)
在前面幾章,我們宏觀地了解了虛擬機(jī)的一些運(yùn)行機(jī)制,那么從這一章節(jié)開始,我們將更加深入虛擬機(jī)的深處去了解其運(yùn)行細(xì)節(jié)了。例如本章節(jié)的學(xué)習(xí)重點(diǎn)是類文件的結(jié)構(gòu),也就是虛擬機(jī)的數(shù)據(jù)入口。既然是數(shù)據(jù)入口,肯定得要符合虛擬機(jī)的數(shù)據(jù)定義規(guī)范才能給虛擬機(jī)處理,否則它壓根就不認(rèn)識你。
概述
在學(xué)習(xí)之前,先拋出一個(gè)比較常見的問題:C語言與Java的運(yùn)行效率如何?其實(shí)這個(gè)問題隨著技術(shù)的發(fā)展越來越不好回答,先看看下圖:
如果單單看C語言和Java語言的一個(gè)運(yùn)行流程,我會(huì)毫無疑問的舉起手腳投C語言運(yùn)行效率比Java的運(yùn)行效率高,但隨著技術(shù)的進(jìn)步和發(fā)展(后面章節(jié)會(huì)學(xué)習(xí)到的技術(shù)),我只能說Java的運(yùn)行速度跟其它的高級語言相比只會(huì)越來越近,并且某些情況不輸給C語言。當(dāng)然,這一章節(jié)討論的不是跟其它語言比效率,是先給你和我一個(gè)比較宏觀的角度去理解類文件的位置。Java語言最大的優(yōu)勢就是一次編譯到處運(yùn)行,不像C語言文件在不同的操作系統(tǒng)會(huì)有兼容性問題。但凡事有收獲就肯定有付出的,世界上沒有那么完美的事情,Java這跨平臺(tái)的優(yōu)勢也卻卻是劣勢。因?yàn)槎嗔艘粚印疤摂M機(jī)系統(tǒng)”這件“溫暖的棉襖”才得以讓Java可以到處跑,也確實(shí)有人用C語言是裸奔而Java是裹著棉襖奔跑來形容兩者的運(yùn)行效率。C語言編譯后是機(jī)器語言文件可以直接執(zhí)行,而Java語言文件編譯后是類文件。類文件還需要在虛擬機(jī)運(yùn)行時(shí)(解釋+編譯)轉(zhuǎn)換成機(jī)器語言才能執(zhí)行。如果我們直接去查看機(jī)器語言文件,里面除了0就是1,這就是計(jì)算機(jī)唯一認(rèn)識的兩個(gè)字。因?yàn)轭愇募卜Q字節(jié)文件,就是以一個(gè)字節(jié)(8bit)為單位組成的文件, 用文本打開一樣是全是0和1的二進(jìn)制樣式,但類文件的二進(jìn)制規(guī)則和機(jī)器語言的二進(jìn)制規(guī)則又有所不同。例如類文件開頭的前32位(4字節(jié))是定義類文件的標(biāo)識,前32位字節(jié)如果Java虛擬機(jī)不認(rèn)識,那就不是類文件了。同理,如果計(jì)算機(jī)硬件不認(rèn)識這個(gè)二進(jìn)制文件的排版規(guī)則,那就是這個(gè)不是機(jī)器語言。而這一章節(jié)主要學(xué)習(xí)的就是類文件是如何組成的?又有哪些規(guī)則?其實(shí)說白了,類文件也是一種語言文件,只不過面對的不是我們這些普羅大眾的應(yīng)用開發(fā)者,而是面向于那些基于Java虛擬機(jī)的語言設(shè)計(jì)者和開發(fā)者看的而已。
無關(guān)性的基石
&