title: JVM學習筆記——Java的內存區域特徵
description: 最近開始着手JVM的學習,在這裏把本身學習過程當中的筆記分享出來,但願能幫到一些小夥伴,同時也是對本身的學習的一個梳理。
date: 2018-08-30 21:16:24java
Java的內存區域
內存區域劃分圖
內存區域的特徵
方法區(Method Area)
- 線程共享區域
- 存儲被虛擬機加載的類信息、常量、靜態變量、編譯後的代碼等,又被稱爲Non-Heap,爲堆的一個邏輯部分。在HotSpot虛擬機中,該區域也被做爲永久代,但JDK1.7後的HotSpot中,已經將運行時常量池移出永久代。
- 其中運行時常量池,具有動態性,運行期間也能夠放入新的常量,例如String.intern()。
- 內存沒法知足需求時,拋出OOM(OutOfMemoryError)。
虛擬機棧(VM Stack)
- 線程私有,生命週期與線程相同
- 描述Java方法執行的內存模型。每次調用方法就建立一個棧幀(Stack Frame)用於存儲局部變量表、操做數棧、動態連接、方法出口等信息;結束方法時棧幀就出棧。
- 局部變量表存放基本數據類型與對象引用類型(指向對象的指針)
- 請求的棧深度超出虛擬機容許的深度,拋出StackOverflowError;若是設定了動態擴展深度,擴展時申請不到內存,拋出OOM。
本地方法棧(Native Method Stack)
- 大部分特性與虛擬機棧相似,不一樣的是本地方法棧爲native方法服務,在部分虛擬機中虛擬機棧會與本地方法棧合二爲一。
堆(heap)
- 線程共享區域
- 存放對象實例及數組,GC的主要區域;存儲時處於物理上不連續的內存空間中;經過-Xmx和-Xms配置大小。
- 堆沒法擴展或沒有內存完成實例分配時,拋出OOM
程序計數器(Program Counter Register)
- 線程私有
- 當前線程所執行的字節碼的行號指示器。執行普通方法時記錄字節碼指令地址;執行native方法時,則值爲空(Undefined)。
直接內存()
- 直接內存不屬於JVM規範中定義的內存區域,它是計算機的真實內存,在配置虛擬機參數時,常常會忽略直接內存,使得各個內存區域總合大於物理內存限制,從而致使OOM的發生。