JVM系列(一)

初識(shí)Java虛擬機(jī)

1. 什么是Java虛擬機(jī)

虛擬機(jī)是一種抽象化的計(jì)算機(jī)惕蹄,通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的琴许。Java虛擬機(jī)有自己完善的硬體架構(gòu),如處理器讲坎、堆棧借跪、寄存器等政己,還具有相應(yīng)的指令系統(tǒng)。JVM屏蔽了與具體操作系統(tǒng)平臺(tái)相關(guān)的信息垦梆,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼)匹颤,就可以在多種平臺(tái)上不加修改地運(yùn)行。

Java虛擬機(jī)存在的原因是可以屏蔽底層操作系統(tǒng)的不同托猩,使得同一個(gè)java文件編譯生成的字節(jié)碼文件可以通過(guò)不同的操作系統(tǒng)對(duì)應(yīng)的java虛擬機(jī)印蓖,它把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行 。java使得java語(yǔ)言可以做到”一次編譯京腥,到處運(yùn)行“赦肃。因此,java是一種跨平臺(tái)的語(yǔ)言公浪。

因?yàn)橛辛薐ava虛擬機(jī)這一層“解釋”他宛,會(huì)使得java程序運(yùn)行時(shí)間比C/C++等語(yǔ)言慢。

2. 從進(jìn)程的角度理解JVM

眾所周知欠气,Java虛擬機(jī)是運(yùn)行在操作系統(tǒng)之中的厅各,那么它在運(yùn)行的時(shí)候就是操作系統(tǒng)的一個(gè)進(jìn)程,因?yàn)檫M(jìn)程是操作系統(tǒng)的執(zhí)行單位预柒。當(dāng)它在運(yùn)行的時(shí)候队塘,它就是一個(gè)操作系統(tǒng)中的進(jìn)程實(shí)例,當(dāng)它沒(méi)有在運(yùn)行時(shí)(作為可執(zhí)行文件存放于文件系統(tǒng)中)宜鸯,可以把它叫做程序憔古。

javac xxx.java
java xxx

相信上面兩條命令,大家肯定很熟悉了淋袖。執(zhí)行完第一步之后鸿市,生成java文件對(duì)應(yīng)的字節(jié)碼,而操作系統(tǒng)是無(wú)法直接識(shí)別字節(jié)碼的即碗,此時(shí)就需要調(diào)用操作系統(tǒng)對(duì)應(yīng)的虛擬機(jī)將字節(jié)碼解釋成操作系統(tǒng)所能識(shí)別的二進(jìn)制可執(zhí)行文件焰情。此時(shí)我們調(diào)用了一個(gè)名叫java的程序,而這個(gè)程序運(yùn)行之后就是一個(gè)JVM實(shí)例剥懒。

執(zhí)行的流程

java命令執(zhí)行后啟動(dòng)虛擬機(jī)進(jìn)程烙样,虛擬機(jī)進(jìn)程啟動(dòng)完畢之后會(huì)讀取參數(shù)(即 java命令后面接的.class文件名和一些命令行傳參的參數(shù)),把他作為初始類加載到內(nèi)存蕊肥,對(duì)這個(gè)類進(jìn)行初始化和動(dòng)態(tài)鏈接谒获。(初始化和動(dòng)態(tài)鏈接在后面會(huì)講,此處留個(gè)印象即可)接下來(lái)便是從該類的main方法開(kāi)始執(zhí)行壁却。

總結(jié)分析

  • .class文件不是直接被系統(tǒng)加載之后就直接在CPU執(zhí)行的批狱,而是被一個(gè)叫做虛擬機(jī)的進(jìn)程托管的。首先必須虛擬機(jī)進(jìn)程啟動(dòng)就緒展东,然后由虛擬機(jī)中的類加載器加載必要的class文件赔硫,包括jdk中的基礎(chǔ)類(如String和Object等),然后由虛擬機(jī)進(jìn)程解釋class字節(jié)碼指令盐肃,把這些字節(jié)碼指令翻譯成本機(jī)cpu能夠識(shí)別的指令爪膊,才能在cpu上運(yùn)行权悟。
  • 更深層次的講,當(dāng)我們?cè)谶\(yùn)行class文件的時(shí)候推盛,其實(shí)真正執(zhí)行的是Java虛擬機(jī)進(jìn)程峦阁,而不是我們的程序。那我們寫(xiě)的編譯生成的class文件是有什么作用呢耘成?它只是虛擬機(jī)進(jìn)程執(zhí)行時(shí)需要的“原料”榔昔。這些“原料”在運(yùn)行時(shí)被加載到虛擬機(jī)中,被虛擬機(jī)解釋執(zhí)行瘪菌,以控制虛擬機(jī)實(shí)現(xiàn)我們java代碼中所定義的一些相對(duì)高層的操作撒会,比如創(chuàng)建一個(gè)文件等,**可以將class文件中的信息看做對(duì)虛擬機(jī)的控制信息师妙,也就是一種虛擬指令诵肛。 **虛擬機(jī)只是處理一些底層的操作,例如內(nèi)存的分配和釋放等等默穴。

3.JVM體系結(jié)構(gòu)簡(jiǎn)介

image

一個(gè)Java虛擬機(jī)在運(yùn)行過(guò)程中有三個(gè)子系統(tǒng)保證它的正常運(yùn)行曾掂,分別是類加載器子系統(tǒng),執(zhí)行引擎子系統(tǒng)壁顶,垃圾收集子系統(tǒng)珠洗。

類加載器子系統(tǒng)

這個(gè)子系統(tǒng)用來(lái)在運(yùn)行的時(shí)候根據(jù)需要?jiǎng)討B(tài)加載類,“根據(jù)需要”代表的便是當(dāng)虛擬機(jī)運(yùn)行過(guò)程中需要該類若专,才會(huì)去加載它许蓖,而不是一次性加載所有的類。

執(zhí)行引擎子系統(tǒng)

由虛擬機(jī)加載的類调衰,被加載到Java虛擬機(jī)內(nèi)存中之后膊爪,虛擬機(jī)會(huì)讀取并執(zhí)行它里面存在的字節(jié)碼指令。虛擬機(jī)中執(zhí)行字節(jié)碼指令的部分叫做執(zhí)行引擎嚎莉。

垃圾收集子系統(tǒng)

Java虛擬機(jī)會(huì)進(jìn)行自動(dòng)內(nèi)存管理米酬。具體說(shuō)來(lái)就是自動(dòng)釋放沒(méi)有用的對(duì)象,而不需要程序員編寫(xiě)代碼來(lái)釋放分配的內(nèi)存趋箩。這部分工作由垃圾收集子系統(tǒng)負(fù)責(zé)赃额。

歡迎關(guān)注本人博客:https://allen-yu.com/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叫确,隨后出現(xiàn)的幾起案子跳芳,更是在濱河造成了極大的恐慌,老刑警劉巖竹勉,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飞盆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)吓歇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)孽水,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人城看,你說(shuō)我怎么就攤上這事女气。” “怎么了析命?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逃默。 經(jīng)常有香客問(wèn)我鹃愤,道長(zhǎng),這世上最難降的妖魔是什么完域? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任软吐,我火速辦了婚禮,結(jié)果婚禮上吟税,老公的妹妹穿的比我還像新娘凹耙。我一直安慰自己,他們只是感情好肠仪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布肖抱。 她就那樣靜靜地躺著,像睡著了一般异旧。 火紅的嫁衣襯著肌膚如雪意述。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天吮蛹,我揣著相機(jī)與錄音荤崇,去河邊找鬼。 笑死潮针,一個(gè)胖子當(dāng)著我的面吹牛术荤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播每篷,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瓣戚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了焦读?” 一聲冷哼從身側(cè)響起带兜,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吨灭,沒(méi)想到半個(gè)月后刚照,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喧兄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年无畔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啊楚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浑彰,死狀恐怖恭理,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郭变,我是刑警寧澤颜价,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站诉濒,受9級(jí)特大地震影響周伦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜未荒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一专挪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧片排,春花似錦寨腔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冶共,卻和暖如春靖避,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背比默。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工幻捏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人命咐。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓篡九,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親醋奠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榛臼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1、什么是類的加載 類的加載指的是將類的.class文件中的二進(jìn)制數(shù)據(jù)讀入到內(nèi)存中窜司,將其放在運(yùn)行時(shí)數(shù)據(jù)區(qū)的方法區(qū)內(nèi)...
    Java_Explorer閱讀 303評(píng)論 0 2
  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,130評(píng)論 0 2
  • 代碼編譯的結(jié)果從本地機(jī)器碼轉(zhuǎn)變?yōu)樽止?jié)碼沛善,是存儲(chǔ)格式發(fā)展的一小步,確實(shí)編譯語(yǔ)言發(fā)展的一大步塞祈。 虛擬機(jī)把描述類的數(shù)據(jù)從...
    胡二囧閱讀 945評(píng)論 0 0
  • 1. 基礎(chǔ)知識(shí) 1.1金刁、 基本概念、 功能 馮諾伊曼體系結(jié)構(gòu)1、計(jì)算機(jī)處理的數(shù)據(jù)和指令一律用二進(jìn)制數(shù)表示2尤蛮、順序執(zhí)...
    yunpiao閱讀 5,253評(píng)論 1 22
  • 2017-04-30 華杉 王陽(yáng)明的兒童教育法媳友,說(shuō)得非常精準(zhǔn)。在家時(shí)的一項(xiàng)工作产捞,自己輔導(dǎo)孩子醇锚,難處倒不在于管住孩子...
    郁萍閱讀 550評(píng)論 0 0