運行時數(shù)據(jù)區(qū)域
2漏健、Java虛擬機棧(Java Virtual Machine Stacks)
????Java虛擬機棧(Java Virtual Machine Stacks)也是線程私有的,它的生命周期與線程相同橘霎。虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀(Stack Frame)用于存儲局部變量表蔫浆、操作數(shù)棧、動態(tài)鏈表姐叁、方法出口等信息瓦盛。每一個方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機棧中入棧到出棧的過程外潜。
? ? 局部變量表存放了編譯器可知的各種基本數(shù)據(jù)類型(boolean原环、byte、char处窥、short嘱吗、int、float滔驾、long谒麦、double)、對象引用(reference類型哆致,它不等于對象本身绕德,可能是一個指向?qū)ο笃鹗嫉刂返囊弥羔槪部赡苁且粋€代表對象的句柄或其他與此對象相關(guān)的位置)和returnAddress類型(指向了一條字節(jié)碼指令的地址)摊阀。
? ? 其中64位長度的long和double類型的數(shù)據(jù)會占用2個局部變量空間(Slot)迁匠,其余的數(shù)據(jù)類型只占用1個。局部變量表所需的內(nèi)存空間在編譯期間完成分配驹溃,當(dāng)進(jìn)入一個方法時城丧,這個方法需要在棧中分配多大的局部變量表空間是完全確定的,在方法運行期間不會改變局部變量表的大小豌鹤。
? ? 如果線程請求的棧深度大于虛擬機所允許的深度亡哄,將拋出StackOverflowError異常;如果虛擬機棽几恚可以動態(tài)擴展蚊惯,如果擴張時無法申請到足夠的內(nèi)存愿卸,就會拋出OutOfMemoryError異常。