Java培訓班教程系列分享JVM模型的介紹一,Java內存分配:JVM定義了若干個程序執行期間使用的數據區域。這個區域里的一些數據在JVM啟動的時候創建,在JVM退出的時候銷毀。而其他的數據依賴于每一個線程,在線程創建時創建,在線程退出時銷毀。
Java按照內存使用區域可以分為四個部分:堆、棧、方法區和程序計數器;其中棧又可以分為兩大部分:Java虛擬機棧和本地方法棧;下面我將通過自己的學習與別人總結的參考見解來介紹下jvm
圖片1
程序計數器
程序計數器是一塊較小的內存空間,它被用來記錄當前指令執行程序的位置,在內部通過改變計數器的位置來確定下一條指令執行程序的位置;
我們知道Java多線程的實質是通過線程輪流切換并分配處理執行事件來實現的,而在任何一個確定的時刻,一個處理器只會執行一個線程中的一條指令。為了能讓線程切換后仍然能恢復到原來的位置,每個線程都需要有一個獨立的程序計數器,他們之間互不影響,所以,程序計數器是線程私有的內存區域
如果一個線程正在執行一個Java方法,那么程序計數器記錄的就是正在執行的虛擬機字節碼指令的地址;如果正在執行一個native方法,那么程序計數器的值就為空;
程序計數器是唯一一個在Java虛擬機規范中沒有規定任何OutOfMemoryError情況的區域,在四個區域中只有它不會出現內存溢出的情況
棧之Java虛擬機棧
Java虛擬機棧描述的是Java方法的內存模型;每個方法在被執行的同時都會創建一個Java虛擬機棧(棧幀),用于存儲局部變量表、操作棧、動態鏈接和方法出口等信息,因此Java虛擬機棧也是線程私有的;
類似于動畫是由一棧一棧的棧幀切換產生的,程序的執行也是由棧幀的切換產生的,只是這些棧幀中存放的是方法的局部變量、操作棧、動態鏈接和方法出口等信息;每一個方法被調用直至執行完成的過程,就是一個棧幀在虛擬機棧中從入棧到出棧的過程;
對于執行引擎來說,只有棧頂的棧幀是有效的,稱為當前棧幀,這個棧幀關聯的方法稱為當前方法,執行引擎所有的字節碼指令都值針對當前棧幀進行操作;
通常我們所說的變量存儲在棧中是不嚴謹的,在Java虛擬機棧中存放的是對應方法的局部變量,而且這些局部變量存放在Java虛擬機中的局部變量表中;對于保存的局部變量分類:Java中的基本數據類型變量的值存放在局部變量表,而對于引用類型變量來說,局部變量表只會存放對象的引用,真正的值存放在堆中;
Java虛擬機是使用局部變量表來完成參數值到參數變量表的傳遞過程的,系統不會為局部變量賦予初始值(對于實例變量和類變量都會賦予初始值)
在Java虛擬機規范中,對Java虛擬機棧規定了兩種異常情況:如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError 異常;如果虛擬機棧動態擴展時無法申請到足夠的內存時,會拋出OutOfMemoryError 異常
以上就是小編介紹的"Java培訓班分享的內容,希望對大家有幫助,如有疑問還可以點擊進入Java視頻教程進行學習。
Java培訓班:http://Java.qfedu.com/