謝邀!
Java運行時數據區中的棧有Java虛擬機棧和本地方法棧,都是用于方法的執行;堆用于存放對象實例和數組。
Java虛擬機棧
每個Java方法執行的時候都會創建一個棧幀,棧幀用于存儲局部變量表、操作數棧、動態鏈表和方法出口等信息,每個Java方法從開始調用到執行完成的過程,都對應著一個棧幀在Java虛擬機棧中入棧到出棧的過程。在Java虛擬機規范中規定,如果線程請求的深度大于虛擬機所允許的深度,將拋出StackOverflowError異常;如果虛擬機可以動態擴展,但是在擴展時申請不到足夠的內存,將會拋出OutOfMemoryError異常。Java虛擬機棧的生存周期是跟隨線程的,是線程私有的。
本地方法棧
Java虛擬機棧是為執行Java方法服務的,而本地方法棧是為執行本地方法服務的,它的作用與Java虛擬機棧相似,同樣它也會拋出StackOverflowError異常和OutOfMemoryError異常。本地方法棧的生存周期也是跟隨線程的,也是線程私有的。
堆
堆是Java虛擬機中內存空間最大的一塊,基本上所有的對象實例及數組都在這里分配內存空間,它是所有線程共享的區域。在Java虛擬機規范中,堆可以處于物理上不連續的內存空間,只要邏輯上連續就行。當堆中沒有足夠內存分配時,并且此時也無法再擴展,將會拋出OutOfMemoryError異常。