1.程序計數器
它被看作當前線程所執行字節碼的行號指示器,這塊區域是“線程私有”的內存。
2.Java虛擬機棧
與程序計數器一樣,也是線程私有的,它的生命周期與線程相同。虛擬機棧描述的是java方法的內存模型,每個方法在執行的同時都會創建一個棧幀(Stack Frame)用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息,每一個方法調用直至執行完成的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程。
java虛擬機規范中,對這個區域規定了2種異常情況:如果線程請求的棧深度大于虛擬機所允許的深度將拋出StackOverflowError異常;如果如果虛擬機棧可以動態擴展,如果擴展時無法申請到足夠的內存就會拋出OutOfMemoryError異常。
3.本地方法棧
與虛擬機棧發揮的作用非常相似,只不過虛擬機棧為虛擬機執行java方法服務,本地方法棧為虛擬機使用到的Native方法服務,與虛擬機棧一樣,本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。
4.Java堆
java堆(java heap)是java虛擬機所管理的內存最大的一塊,是被所有線程共享的一塊內存區域,在虛擬機啟動時創建,此內存唯一的目的就是存放java對象。
java堆是java垃圾收集器管理的主要區域,從內存回收角度,由于現在的收集器主要采用分代收集算法,所以java堆中還可以細分為:新生代和老年代;再細致一點有Eden空間、From Survivor空間、To Survivor空間等。根據虛擬機規范規定,java堆可以出于物理上不連續的空間,只要邏輯上連續即可,java虛擬機通過-Xms、-Xmx來控制java堆的大小,如果堆中沒有足夠的內存來完成java實例分配,并且堆也無法再擴展時,將會拋出OutOfMemoryError異常。
5.方法區
與java堆一樣,是各個線程共享的內存區域,用于存儲已被加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。