JVM運行時數據區

Java虛擬機執行Java程序時,會把虛擬機管理的內存劃分紅不一樣的區域,用於處理程序運行過程當中不一樣的數據。spa

Java虛擬機運行時數據區

程序計數器

線程私有

對於一個處理器,只會執行一個線程的指令。線程並非一直獨享CPU的,多個線程經過切換的方式,實現一段時間內的同時執行。所以,爲了線程切換後能恢復到切換前的執行位置,每一個線程都須要有個獨立的空間來記錄執行位置,即程序計數器。各個線程之間的程序計數器互不影響,獨立存儲。線程

內存空間小

程序計數器中存儲的爲當前線程執行的指令:blog

  • 若是當前執行的是Java方法,程序計數器記錄的是正在執行的虛擬機字節碼指令地址
  • 若是執行的是Native方法,程序計數器記錄的值爲空

沒有OutOfMemoryError狀況

惟一在虛擬機規範中沒有規定任何OutOfMemoryError狀況的區域。內存

虛擬機棧

線程私有

棧幀結構

每一個方法在執行時都會建立一個棧幀。棧幀存儲了局部變量表、操做數棧、動態連接、方法出口等信息。方法從調用到執行完成對應了棧幀在虛擬機棧的入棧到出站過程。rem

StackOverflowError異常

棧是有深度(大小)的,當線程請求的棧深度大於了虛擬機容許的深度,則throw StackOverflowError。編譯器

OutOfMemoryError異常

若是虛擬機棧可動態擴展,當沒法申請到足夠的內存,則throw OutOfMemoryError。虛擬機

堆是Java人員常常說起的一塊內存區域,也是關注最多的一塊區域。堆具備一下特色:it

  • 一般是虛擬機管理的最大的一塊區域
  • 被全部線程共享
  • 垃圾收集器管理的主要區域
  • OutOfMemoryError異常

從內存回收的角度來看,Java對能夠分爲新生代和老年代。編譯

Java堆

方法區

方法區是全部線程共享的內存區域,用來存儲已經被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。方法區沒法知足內存分配需求時,也會拋出OutOfMemoryError異常。class

相關文章
相關標籤/搜索