標籤:
JDK是支援Java程式開發的最小環境集,JRE是支援Java程式啟動並執行標準環境,JRE是JDK的一部分。
Java 1.0版本誕生於1995年,其使用的虛擬機器是Sun Classisc VM,這款虛擬機器已經不再使用。JDK1.3時,HotSpot VM成為了預設的虛擬機器。其他較為出名的Java虛擬機器還包括JRockit、J9等。
JDK1.5中的java.util.concurrent包實現了一個粗粒度的並發架構,JDK1.7中的java.util.concurrent.forkjoin包則是對該架構的一次重要擴充。Fork/Join是處理並行的一個經典的方法,能夠輕鬆地利用多個CPU,利用Fork/Join模式,我們可以順利地過渡到多核時代。
Java 8中,將會提供對lamda的支援,函數式編程將會得到很好地支援,而函數式編程的一個重要特點就是適合并行運算。
由於指標膨脹和各種資料類型對齊補白等原因,64位的Java虛擬機器的效率要比32位的Java虛擬機器效率低。企業級J2EE經常需要4GB以上的記憶體,目前很多仍採用虛擬叢集方式在32位虛擬機器中運行,迫切需要64位虛擬機器的支援。
Java虛擬機器在運行Java程式時會將它所管理的記憶體劃分為若干不同的地區。這些地區有著各自的用途,以及建立和銷毀時間。根據《Java虛擬機器規範(Java SE7版)》的規定,Java虛擬機器將會把它所管理的記憶體劃分為下面的幾個地區:
我們可以看到運行時資料區中的方法區和堆是由所有的線程所共用的,其餘的如虛擬機器棧、本地方法棧、程式計數器都是線程間隔離的。
程式計數器,可以看做當前線程所執行的位元組碼的行號指標。位元組碼解譯器通過程式計數器中的值來選取下一條下一條需要執行的位元組碼指令。迴圈、跳轉、異常都需要依賴於程式計數器來完成。
執行多線程的程式時,為了確保線程切換後能恢複到正確的執行位置,每個線程都需要一個獨立的程式計數器。
此地區是唯一一個在Java虛擬機器規範中沒有規定OutOfMemoryError的地區。
Java虛擬機器棧,Java虛擬機器棧是線程私人的,它的生命週期和線程相同。Java虛擬機器棧包含的資訊包括:局部變數、運算元棧、動態連結、方法出口等。
Java虛擬機器中針對這塊記憶體定義了2種異常,如果線程請求的棧深度大於虛擬機器所允許的深度,將會拋出StackOverflowError異常,如果虛擬機器棧無法申請到足夠的記憶體,就會拋出OutOfMemoryError異常。
本地方法棧,本地方法棧和Java虛擬機器棧的作用很相似,只是本地方法棧是為Java虛擬機器的Native方法服務的。很多的虛擬機器(例如HotSpot)就直接將本地方法棧和Java虛擬機器棧合二為一。
Java堆,Java堆的目的是存放對象執行個體。Java堆是記憶體回收管理器管理的主要區域,Java堆可以分為新生代和老生代,再具體一點可以分為Eden空間、From Survivor、To Survivor等。
Java堆可以是物理上不連續的空間,只要是邏輯上連續即可。
主流Java虛擬機器中的Java堆都是可變的,通過-Xmx和-Xms來控制。
Java堆上無法申請記憶體時也會拋出OutOfMemoryError異常。
方法區和Java堆一樣,也是線程間共用的記憶體地區。方法區主要用於儲存類資訊、常量、靜態變數等資料。
對應HotSpot虛擬機器而言,方法區可以被看做是永生代。但並非資料進入了方法區就不會被回收,方法區的回收主要是常量池的回收和類型的卸載。
static是靜態變數,在每次賦值的時候保留最後一個值·是屬於類變數,通過類或者對象可以修改,而final是屬於常量,賦值一次,不可以再次重新賦值。
《深入理解Java虛擬機器》學習筆記(一)