一、程序計數器/pc 寄存器:java
線程私有,Java 虛擬機能夠支持多條線程同時執行,每一條 Java 虛擬機線程都有自 己的 pc(program counter)寄存器。在任意時刻,一條 Java 虛擬機線程只會執行一個方法的代碼,這個正在被線程執行的方法稱爲該線程的當前方法。若是這個方法不是 native 的,那 pc 寄存器就保存 Java 虛擬機正在執行的字節碼指令的地址, 若是該方法是 native 的,那 pc 寄存器的值是 undefined。pc 寄存器的容量至少應當能保 存一個 returnAddress 類型的數據或者一個與平臺相關的本地指針的值。算法
二、虛擬機棧:數組
線程私有,記錄方法運行產生的臨時變量。在Java虛擬機規範中,對這個區域規定了兩種異常情況:若是線程請求的棧深度大於虛擬機所容許的深度,將拋出StackOverflowError異常;若是虛擬機能夠動態擴展,若是擴展時沒法申請到足夠的內存,就會拋出OutOfMemoryError異常。spa
三、本地方法棧線程
相似虛擬機棧,有的虛擬機將二者合二爲一,主要爲native方法服務。翻譯
四、java堆/java heap設計
線程間共享,全部對象實例以及數組都在java heap上分配。Java 堆是垃圾收集器管理的主要區域,所以不少時候也被稱作「GC 堆」(GarbageCollected Heap,幸虧國內沒翻譯成「垃圾堆」)。若是從內存回收的角度看,因爲如今收集器基本都是採用的分代收集算法,因此Java 堆中還能夠細分爲:新生代和老年代;再細緻一點新生代能夠分爲Eden 空間、From Survivor 空間、To Survivor 空間等指針
五、方法區對象
存放java編譯的類信息、常量、靜態變量等。gc回收頻率低,內存回收會對常量池和類型回收,方法區是java堆的邏輯組成部分,可是簡單的虛擬機實 現能夠選擇在這個區域不實現垃圾收集與壓縮。HotSpot 虛擬機的設計團隊選擇把GC 分代收集擴展至方法區,或者說使用永久代來實現方法區。可是Hotspot在jdk 1.8放棄了「永久代」(PermGen) 被metaspace替代。接口
六、運行時常量池
方法區的一部分。運行時常量池(runtime constant pool)是class文件中每個類或接口的常量池表 (constant_pool table,見 4.4 節)的運行時表示形式,它包括了若干種不一樣的常量,從編譯期可 知的數值字面量到必須在運行期解析後才能得到的方法或字段引用。運行時常量池相似於傳統語言中的符號表(symbol table),不過它存儲數據的範圍比一般意義上的符號表要更爲普遍。
運行時常量池相對於Class 文件常量池的另一個重要特徵是具有動態性,Java 語言並不要求常量必定只能在編譯期產生,也就是並不是預置入Class 文件中常量池的內容才能進入方法區運行時常量池,運行期間也可能將新的常量放入池中,這種特性被開發人員利用得比較多的即是String 類的intern() 方法。
以上每一個內存區域當沒法申請到內存時都會拋出異常OutOfMemoryError異常。