jvm ----java virtual machine (熟稱:java虛拟機),jvm
在執行java程式的過程中将内容劃分為若幹個區域,其有各自的用途和管理機制。如下圖:

1. 程式電腦(program counter register) --
是目前線程所執行位元組碼的行号訓示器,通過改變其值來實作執行不同的代碼指令。記憶體占用小,線程私有,支援多線程處理(多線程時,每個線程有一個獨立程式電腦,已達到各自互不影響),
也正是由于這些特點,該區域是jvm規範中唯一沒有規定任何outofmemoryerror的區域。
2. java 虛拟機棧(jvm stack)
也是線程私有,和線程有相同的生命周期,是java方法執行的記憶體模型,
即:每個方法執行時,都會同時建立一個stack
frame(棧幀)用于存儲局部變量(8種基本資料類型、對象引用類型)、操作數棧、動态連結、方法出口資訊。方法調用到執行完成的過程也是stack
frame棧幀出、入jvm stack的過程.
在jvm規範中,規定了兩種記憶體異常:
一是:線程請求的棧深度超過了棧允許的最大深度,将抛出:stackoverflowerror 異常。
二是:當java虛拟機動态擴充時,無法申請到足夠的記憶體時,将抛出:outofmemoryerror異常。
3. 本地方法棧(native method stack)
與jvm stack 相似,jvm stack 為虛拟機執行java方法服務,而native method
stack 是為虛拟機執行本地方法服務。有的虛拟機對兩者沒有區分,合二為一。
同樣會存在兩種異常: stackoverflowerror 和
outofmemoryerror 異常.
4. java 堆(heap)
heap 是java記憶體管理中最大的一塊記憶體區域,被所有線程共享,用于存放對象執行個體,幾乎所有的對象執行個體和數組都在此配置設定。
在jvm規範中規定,java堆可以實體不聯系,隻要邏輯空間聯系即可。這樣,當堆heap無法完成再擴充時,将會抛出:outofmemoryerror異常。
5. 方法區(method area)
方法區也是多線程共享的記憶體區域,用于存儲已被虛拟機加載的類資訊、常量、靜态變量、即時編譯的代碼資料。(jvm規範把方法區描述為堆的一個邏輯區域)
方法區在無法滿足記憶體配置設定時,将抛出outofmemoryerror 異常。
6. 運作時常量池(runtime constant pool )
運作時常量池是方法區的一部分,用于存放編譯期生成的各種字面量和符号引用,這部分内容将在類加載後存放到方法區的運作時常量池。
7. 直接記憶體(direct memory)
本機記憶體配置設定不受java
虛拟機(堆,棧等)的影響,但是受機器記憶體的影響,當各區域記憶體總和大于實體記憶體時,導緻動态擴充記憶體出現:outofmemoryerror異常。