Java虛擬機執行Java程序時,會把虛擬機管理的內存劃分紅不一樣的區域,用於處理程序運行過程當中不一樣的數據。spa
對於一個處理器,只會執行一個線程的指令。線程並非一直獨享CPU的,多個線程經過切換的方式,實現一段時間內的同時執行。所以,爲了線程切換後能恢復到切換前的執行位置,每一個線程都須要有個獨立的空間來記錄執行位置,即程序計數器。各個線程之間的程序計數器互不影響,獨立存儲。線程
程序計數器中存儲的爲當前線程執行的指令:blog
惟一在虛擬機規範中沒有規定任何OutOfMemoryError狀況的區域。內存
每一個方法在執行時都會建立一個棧幀。棧幀存儲了局部變量表、操做數棧、動態連接、方法出口等信息。方法從調用到執行完成對應了棧幀在虛擬機棧的入棧到出站過程。rem
棧是有深度(大小)的,當線程請求的棧深度大於了虛擬機容許的深度,則throw StackOverflowError。編譯器
若是虛擬機棧可動態擴展,當沒法申請到足夠的內存,則throw OutOfMemoryError。虛擬機
堆是Java人員常常說起的一塊內存區域,也是關注最多的一塊區域。堆具備一下特色:it
從內存回收的角度來看,Java對能夠分爲新生代和老年代。編譯
方法區是全部線程共享的內存區域,用來存儲已經被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。方法區沒法知足內存分配需求時,也會拋出OutOfMemoryError異常。class