Java虛擬機在執行Java程序時,會把其所管理的內存劃分若干個不一樣的數據區域,具體劃分以下圖所示:jvm
備註:本圖摘自《深刻理解Java虛擬機:JVM高級特性與最佳實踐》一書線程
1.程序計數器對象
較小的內存空間,能夠看做是當前線程所執行的字節碼的行號指示器。每條線程都須要有一個獨立的程序計數器,各個線程之間的計數器互不影響且獨立存儲,稱爲「線程私有」的內。blog
此內存區域是jvm規範中沒有任何OutOfMemoryError狀況的區域。內存
2.Java虛擬機棧編譯器
也是線程私有的,他的聲明週期和線程相同。每一個方法執行的時候,都會建立一個棧幀用於存儲局部變量表、操做棧、動態連接、方法出口等信息。每個方法被調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。虛擬機
咱們常常講堆內存和棧內存,其中「棧」就是虛擬機棧,或者是虛擬機棧中的局部變量表部分。編譯
此區域有2種異常:若是線程請求的棧深度大於虛擬機所容許的深度,將拋出StackOverflowError異常;若是虛擬機棧能夠動態擴展,當動態擴展沒法申請到足夠的內存時拋出OutOfMemoryError異常。變量
3.本地方法棧擴展
與虛擬機棧做用相似,其是爲虛擬機使用到的Native方法服務。虛擬機規範中並未強制規定,如HotSpot虛擬機直接將其與虛擬機棧合二爲一。
其產生的異常和Java虛擬機棧相同。
4.Java堆
Java堆是jvm管理的最大的內存區域。其是被全部線程共享的一塊區域,在jvm啓動時建立,此內存區域的惟一目的就是存放對象實例,幾乎全部的對象實例都在這裏分配內存。
Java堆是垃圾回收的主要區域,所以也被稱爲「GC堆」。
5.方法區
和Java堆同樣,是各個線程共享的內存區域,用於存儲已被jvm加載的類信息、常量、靜態變量、即時編譯器編譯的代碼等數據。
當方法區沒法知足內存分配需求時,將拋出OutOfMemoryError異常。
方法區的一部分是:運行時常量池,用於存放編譯期生成的各類字面量和符號引用。