Java虛擬機(jī)發(fā)展史
從1996年初sun公司發(fā)布的jdk1.0中所包含的sun Classic VM到今天,曾經(jīng)涌現(xiàn)或消失過(guò)許多經(jīng)典和特色的虛擬機(jī)出現(xiàn)。Classic VM只能使用純編輯器來(lái)執(zhí)行。如果要使用jit編輯器必須使用外掛。執(zhí)行效率和傳統(tǒng)的c/c++程序有很大差異,“Java語(yǔ)言很慢”就是在這個(gè)時(shí)候在用戶中樹立起來(lái)的。
Sun公司努力去解決classvm的問(wèn)題,為了提升運(yùn)行效率,在jdk1.2使用了exact vm 它的執(zhí)行系統(tǒng)已經(jīng)具備現(xiàn)代高性能虛擬機(jī)的雛形。編譯器和解釋器混合工作模式。雖然比第一代先進(jìn)了許多,但在商業(yè)中只存在了很短暫的時(shí)間就被hotspot vm所取代,甚至還沒(méi)來(lái)的及發(fā)布windows和linx下的商用版本。
提起hotspotvm。它是sun jdk 和open jdk中所帶的虛擬機(jī),也是目前使用范圍最廣的Java虛擬機(jī)。繼承了上兩代虛擬機(jī)的優(yōu)點(diǎn)。
熱點(diǎn)代碼和探測(cè)技術(shù),hotSpot熱點(diǎn)探測(cè)能力可以通過(guò)執(zhí)行計(jì)數(shù)器找出最具有編譯價(jià)值的代碼,然后通過(guò)jit以方法為單位進(jìn)行編譯。
Java技術(shù)的未來(lái)是趨向于模塊化的,技術(shù)平臺(tái)越來(lái)越復(fù)雜,越來(lái)越龐大。當(dāng)單一的Java開發(fā)無(wú)法滿足當(dāng)前軟件的復(fù)雜需求,越來(lái)越多的Java虛擬機(jī)的語(yǔ)言開發(fā)被應(yīng)用到我們的軟件項(xiàng)目中。
如今,cpu硬件的發(fā)展方向已經(jīng)從高頻率轉(zhuǎn)化為多核心,軟件開發(fā)越來(lái)越關(guān)注并行編程的領(lǐng)域。Jdk1.5 引入了Java.util.concurrent包實(shí)現(xiàn)了粗粒度的并發(fā)框架。而1.7的forkjoin包則包含了對(duì)這個(gè)框架的一次重要擴(kuò)充。Jdk1.8提供lambda 極大的改善了Java語(yǔ)言不適合函數(shù)式編程的現(xiàn)狀。在幾年之前,主流的cpu就支持64位架構(gòu)了。,Java也早早地推出了支持64位的版本。
想要精通jdk內(nèi)部的實(shí)現(xiàn)機(jī)制,最便捷的路徑是自己編譯一套jdk,雖然門檻高很多,但肯定比閱讀書籍,文章更貼近本質(zhì),怎么獲取jdk源碼?Source bundle releases 獲取打包好的源碼。大概99M,解壓后約 339M。
Java虛擬機(jī)在執(zhí)行Java程序的過(guò)程中,會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)。這些區(qū)域有各自的用途,有的區(qū)域隨著隨著虛擬機(jī)進(jìn)程的啟動(dòng)而存在。有些區(qū)域則依賴于用戶線程的啟動(dòng)和結(jié)束建立和銷毀。
程序計(jì)數(shù)器是一塊較小的內(nèi)存空間,它可以看作當(dāng)前線程執(zhí)行字節(jié)碼的行數(shù)指示器。每條線程都需要一個(gè)獨(dú)立的程序計(jì)數(shù)器。線程之間計(jì)數(shù)器互不影響。如果線程正在執(zhí)行一個(gè)方法,這個(gè)計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令的地址:如果正在執(zhí)行native方法。這個(gè)計(jì)數(shù)器值則為空,此內(nèi)存區(qū)域是唯一一個(gè)虛擬機(jī)沒(méi)有任何outofmemoryError的區(qū)域。
Java虛擬機(jī)棧也是線程私有的,虛擬機(jī)棧是Java方法執(zhí)行的內(nèi)存模型,存儲(chǔ)局部變量表,操作數(shù)棧,方法出口,動(dòng)態(tài)鏈接等信息。如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,拋出stackOverFlowError。本地方法棧為虛擬機(jī)使用native方法使用。
Java堆是管理內(nèi)存中最大的一塊,是所有線程共享,存放對(duì)象實(shí)例。有的時(shí)候也被成為GC堆,采用分代收集算法,分為新生代和老生代 如果堆無(wú)法繼續(xù)擴(kuò)展并且實(shí)例無(wú)法內(nèi)存分配。拋出outofmemoryError。方法區(qū)和堆一樣,各個(gè)線程共享的內(nèi)存區(qū)域。存儲(chǔ)類信息,常量,靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。運(yùn)行時(shí)常量池是方法區(qū)的一部分。直接內(nèi)存并不是虛擬機(jī)運(yùn)行的一部分,也不是Java規(guī)范的內(nèi)存區(qū)域,在jdk1.4加入nio,引入基于通道的緩沖區(qū)的I/o方式,它可以使用native函數(shù)庫(kù)直接分配堆外內(nèi)存,這樣顯著提高性能。
-
JAVA
+關(guān)注
關(guān)注
20文章
3001瀏覽量
116456 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
972瀏覽量
30489
發(fā)布評(píng)論請(qǐng)先 登錄
虛擬機(jī)數(shù)據(jù)恢復(fù)—虛擬機(jī)vmdk文件被刪除的數(shù)據(jù)恢復(fù)案例
Arm架構(gòu)助力Azure Cobalt 100虛擬機(jī)工作負(fù)載性能提升
虛擬機(jī)數(shù)據(jù)恢復(fù)—異常斷電致ESXI存儲(chǔ)失聯(lián)?這份實(shí)戰(zhàn)數(shù)據(jù)恢復(fù)案例請(qǐng)收好
Arm Neoverse CPU上大代碼量Java應(yīng)用的性能測(cè)試
蜂鳥e203在虛擬機(jī)unbuntu上面驗(yàn)證時(shí)報(bào)錯(cuò)的可能原因及解決措施
搭建自己的ubuntu系統(tǒng)之創(chuàng)建ubuntu虛擬機(jī)
中軟國(guó)際鴻云虛擬機(jī)安裝指南
迅為RK3588開發(fā)板掛載Windows以及虛擬機(jī)Ubuntu測(cè)試
TECS OpenStack資源池虛擬機(jī)網(wǎng)絡(luò)二層地址無(wú)法互通的問(wèn)題處理
虛擬化數(shù)據(jù)恢復(fù)—XenServer虛擬化平臺(tái)上VPS不可用的數(shù)據(jù)恢復(fù)案例
Vsan數(shù)據(jù)恢復(fù)——Vsan分布式文件系統(tǒng)上虛擬機(jī)不可用的數(shù)據(jù)恢復(fù)
分布式存儲(chǔ)數(shù)據(jù)恢復(fù)—虛擬機(jī)上hbase和hive數(shù)據(jù)庫(kù)數(shù)據(jù)恢復(fù)案例
Linux內(nèi)核編譯失敗?移動(dòng)硬盤和虛擬機(jī)的那些事兒
Java虛擬機(jī)發(fā)展史:深入理解Java虛擬機(jī)
評(píng)論