Java虛擬機發展史
從1996年初sun公司發布的jdk1.0中所包含的sun Classic VM到今天,曾經涌現或消失過許多經典和特色的虛擬機出現。Classic VM只能使用純編輯器來執行。如果要使用jit編輯器必須使用外掛。執行效率和傳統的c/c++程序有很大差異,“Java語言很慢”就是在這個時候在用戶中樹立起來的。
Sun公司努力去解決classvm的問題,為了提升運行效率,在jdk1.2使用了exact vm 它的執行系統已經具備現代高性能虛擬機的雛形。編譯器和解釋器混合工作模式。雖然比第一代先進了許多,但在商業中只存在了很短暫的時間就被hotspot vm所取代,甚至還沒來的及發布windows和linx下的商用版本。
提起hotspotvm。它是sun jdk 和open jdk中所帶的虛擬機,也是目前使用范圍最廣的Java虛擬機。繼承了上兩代虛擬機的優點。
熱點代碼和探測技術,hotSpot熱點探測能力可以通過執行計數器找出最具有編譯價值的代碼,然后通過jit以方法為單位進行編譯。
Java技術的未來是趨向于模塊化的,技術平臺越來越復雜,越來越龐大。當單一的Java開發無法滿足當前軟件的復雜需求,越來越多的Java虛擬機的語言開發被應用到我們的軟件項目中。
如今,cpu硬件的發展方向已經從高頻率轉化為多核心,軟件開發越來越關注并行編程的領域。Jdk1.5 引入了Java.util.concurrent包實現了粗粒度的并發框架。而1.7的forkjoin包則包含了對這個框架的一次重要擴充。Jdk1.8提供lambda 極大的改善了Java語言不適合函數式編程的現狀。在幾年之前,主流的cpu就支持64位架構了。,Java也早早地推出了支持64位的版本。
想要精通jdk內部的實現機制,最便捷的路徑是自己編譯一套jdk,雖然門檻高很多,但肯定比閱讀書籍,文章更貼近本質,怎么獲取jdk源碼?Source bundle releases 獲取打包好的源碼。大概99M,解壓后約 339M。
Java虛擬機在執行Java程序的過程中,會把它所管理的內存劃分為若干個不同的數據區。這些區域有各自的用途,有的區域隨著隨著虛擬機進程的啟動而存在。有些區域則依賴于用戶線程的啟動和結束建立和銷毀。
程序計數器是一塊較小的內存空間,它可以看作當前線程執行字節碼的行數指示器。每條線程都需要一個獨立的程序計數器。線程之間計數器互不影響。如果線程正在執行一個方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址:如果正在執行native方法。這個計數器值則為空,此內存區域是唯一一個虛擬機沒有任何outofmemoryError的區域。
Java虛擬機棧也是線程私有的,虛擬機棧是Java方法執行的內存模型,存儲局部變量表,操作數棧,方法出口,動態鏈接等信息。如果線程請求的棧深度大于虛擬機所允許的深度,拋出stackOverFlowError。本地方法棧為虛擬機使用native方法使用。
Java堆是管理內存中最大的一塊,是所有線程共享,存放對象實例。有的時候也被成為GC堆,采用分代收集算法,分為新生代和老生代 如果堆無法繼續擴展并且實例無法內存分配。拋出outofmemoryError。方法區和堆一樣,各個線程共享的內存區域。存儲類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據。運行時常量池是方法區的一部分。直接內存并不是虛擬機運行的一部分,也不是Java規范的內存區域,在jdk1.4加入nio,引入基于通道的緩沖區的I/o方式,它可以使用native函數庫直接分配堆外內存,這樣顯著提高性能。
-
JAVA
+關注
關注
19文章
2966瀏覽量
104702 -
虛擬機
+關注
關注
1文章
914瀏覽量
28160
發布評論請先 登錄
相關推薦
評論