java內存組成介紹
堆(Heap)和非堆(Non
heap)內存
按照官方的說法
Java 虛擬機具有一個堆
堆是運行時數據區域
所有類實例和數組的內存均從此處分配
堆是在 Java 虛擬機啟動時創建的
在JVM中堆之外的內存稱為非堆內存(Non
heap memory)
可以看出JVM主要管理兩種類型的內存
堆和非堆
簡單來說堆就是Java代碼可及的內存
是留給開發人員使用的
非堆就是JVM留給 自己用的
所以方法區
JVM內部處理或優化所需的內存(如JIT編譯後的代碼緩存)
每個類結構(如運行時常數池
字段和方法數據)以及方法和構造方法 的代碼都在非堆內存中
組成圖
◆ 方法棧&本地方法棧
線程創建時產生
方法執行時生成棧幀
◆ 方法區
存儲類的元數據信息 常量等
◆ 堆
java代碼中所有的new操作
◆ native Memory(C heap)
Direct Bytebuffer JNI Compile GC;
堆內存分配
JVM初始分配的內存由
Xms指定
默認是物理內存的
/
;JVM最大分配的內存由
Xmx指 定
默認是物理內存的
/
默認空余堆內存小於
%時
JVM就會增大堆直到
Xmx的最大限制
空余堆內存大於
%時
JVM會減少堆直到
Xms的最小限制
因此服務器一般設置
Xms
Xmx相等以避免在每次GC 後調整堆的大小
對象的堆內存由稱為垃圾回收器的自動內存管理系統回收
非堆內存分配
JVM使用
XX:PermSize設置非堆內存初始值
默認是物理內存的
/
;由XX:MaxPermSize設置最大非堆內存的大小
默認是物理內存的
/
JVM內存限制(最大值)
JVM內存的最大值跟操作系統有很大的關系
簡單的說就
位處理器雖然 可控內存空間有
GB
但是具體的操作系統會給一個限制
這個限制一般是
GB
GB(一般來說Windows系統下為
G
G
Linux系統 下為
G
G)
而
bit以上的處理器就不會有限制了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26886.html