
程序計數(shù)器(PC)
程序計數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它的作用可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼行號指示器。 - 當(dāng)前線程所執(zhí)行的字節(jié)碼行號指示器 - 每個線程都有一個 - 線程私有,生命周期與線程相同,隨JVM啟動而生,JVM關(guān)閉而死 - 線程執(zhí)行Java方法時,記錄其正在執(zhí)行的虛擬機字節(jié)碼指令地址 - 線程執(zhí)行Nativan方法時,計數(shù)器記錄為空(Undefined) - 唯一在Java虛擬機規(guī)范中沒有規(guī)定任何OutOfMemoryError情況區(qū)域
Java虛擬機棧
虛擬機棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法被執(zhí)行的時候都會同時創(chuàng)建一個棧幀 (Stack Frame)用于存儲局部變量表、操作棧、動態(tài)鏈接、方法出口等信息。每一個方法被調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機棧中從入棧到出棧的過程。 在Java虛擬機規(guī)范中,對于此區(qū)域規(guī)定了兩種異常狀況: - 如果線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常; - 如果虛擬機??梢詣討B(tài)擴展,當(dāng)擴展時無法申請到足夠的內(nèi)存時會拋出OutOfMemoryError異常。
本地方法棧
本地方法棧(Native Method Stacks)與虛擬機棧所發(fā)揮的作用非常類似,區(qū)別在于虛擬機棧為虛擬機執(zhí)行Java方法服務(wù),而本地方法棧則是為虛擬機使用到的Native方法服務(wù)。
Java堆
Java堆是垃圾收集管理的主要戰(zhàn)場。根據(jù)Java虛擬機規(guī)范的規(guī)定,Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可,就像我們的磁盤空間一樣。在實現(xiàn)時,既可以實現(xiàn)成固定大小的,也可以是可擴展的,不過當(dāng)前主流的虛擬機都是按照可擴展來實現(xiàn)的。 - 通過-Xmx和-Xms控制Heap大小 - 如果在堆中沒有內(nèi)存完成實例分配,并且堆也無法再擴展時,將會拋出OutOfMemoryError異常。
方法區(qū)
方法區(qū)(Method Area)與Java堆一樣,是各個線程共享的內(nèi)存區(qū)域,它用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。 - 方法區(qū)又稱“永久代”(Permanent Generation) - 使用XX:MaxPermSize調(diào)整最大值 - 當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時,將拋出OutOfMemoryError異常。
運行時常量池
運行時常量池(Runtime Constant Pool)是方法區(qū)的一部分。Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池表(Constant Pool Table),用于存放編譯期生成的各種字面量和符號引用,這部分內(nèi)容將在類加載后進入方法區(qū)的運行時常量池中存放。
原文鏈接:http://sparkyuan.me/2016/04/22/JVM運行時數(shù)據(jù)區(qū)域/