一、程序計數器多線程
程序計數器是一塊較小的內存空間,能夠看做是當前線程所執行的字節碼的行號指示器。Java虛擬機的多線程是經過線程輪流切換並分配處理器執行時間的方式來實現的,在任何一個肯定的時刻,一個處理器都只會執行一條線程中的指令。爲了線程切換後能恢復到正確的執行位置,每條線程都須要有一個獨立的程序計數器,各條線程互不影響(線程私有)。線程
二、Java虛擬機棧對象
Java虛擬機棧也是線程私有的,它的生命週期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:每一個方法在執行時都會建立一個棧幀用於存儲局部變量表、操做數棧、動態連接、方法出口燈信息。每個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧和出棧的過程。生命週期
局部變量表存放了編譯期可知的各類基本數據類型(Boolean,byte,char,short,int,float,long,double)、對象引用和returnAddress類型。局部變量表所需的內存空間在編譯期間完成分配。內存
兩種異常:若是線程請求棧深度大於虛擬機鎖容許的深度,將拋出StackOverflowError異常;若是虛擬機棧能夠動態擴展,若是擴展時沒法申請到足夠的內存,就會拋出OutOfMemoryError異常。編譯器
三、本地方法棧虛擬機
本地方法棧與虛擬機所發揮的做用很是類似,他們的區別在於虛擬機棧爲虛擬機執行Java方法(字節碼)服務,而本地方法棧則爲虛擬機使用到的native方法服務。編譯
四、Java堆變量
Java堆是被全部線程共享的一塊內存區域,在虛擬機啓動時建立。此內存區域的惟一目的就是存放對象實例,幾乎全部對象實例都在這裏分配內存。擴展
Java堆是垃圾收集器管理的主要區域,不少時候也稱爲「GC」堆。
Java堆能夠處於物理上不連續的內存空間中,只要邏輯上連續便可。
五、方法區
方法區是線程共享的內存區域,用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
當方法區沒法知足內存分配需求時,將拋出OutOfMemoryError異常。
六、運行時常量池
方法區的一部分,用於存放編譯期生成的各類字面量和符號引用。
當常量池沒法再申請到內存時會拋出OutOfMemoryError異常。
參考文獻
《深刻理解Java虛擬機》 機械工業出版社 周志明著