java運行時數據區域
一、程序計數器
做用:記錄程序執行時的位置
①內存空間較小
②線程私有(java虛擬機的多線程是經過線程輪流切換並分配處理器執行時間的方式實現的),故每個線程都有一個程序計數器,來標識下次執行時的位置
③通常java方法指向的是正在執行的虛擬機字節碼指令地址,native方法,計數器值爲空
④java虛擬機規範中惟一一個沒有規定任何OutOfMemoryError狀況的區域
二、java虛擬機棧
做用:描述java方法執行的內存模型
①線程私有,與線程的生命週期相同
②棧幀記錄着一個方法在虛擬機棧中入棧到出站的過程(棧幀用於存儲局部變量表、操做數棧,方法出口等)
③若是線程請求的棧深度大於虛擬機所容許的深度,拋StackOverflowError異常,若是支持自動擴容,擴展是沒法申請到足夠的內存,則拋OutOfMemoryError
三、本地方法棧
做用:服務native方法
①與虛擬機棧的區別
虛擬機棧未虛擬機執行java(也就是字節碼)服務,而本地方法棧則爲虛擬機使用到的native方法服務
②異常與虛擬機棧同樣
四、java堆
做用:存儲對象實例
①內存最大的一塊
②線程共享
③在虛擬機啓動時建立,惟一目的是存放實例對象,幾乎全部對象都在這裏分配內存(後面可能會變,不是很絕對)
④java堆是垃圾收集器管理的主要區域(GC堆),垃圾回收基本採用分代收集算法
⑤線程共享的java堆中可能劃分出多個線程私有的分配緩衝區TLAB,可是也是存儲的對象實例,這樣作是爲了更好的分配內存和垃圾回收
⑥若是堆中沒有內存完成實例分配,且沒法擴展時,將報OutOfMemoryError異常
五、方法區
做用:存儲已被虛擬機加載的類信息、常量、靜態變量等數據。
①垃圾回收在這個區域少見,這個區域的回收目標是針對長常量池的回收和對類型的寫在
②不採用」永久代」的方式,是因爲更容易內存溢出
③當方法區沒法知足內存分配需求是,拋OutOfMemoryErrorjava