Java基礎——JVM內存結構
阿新 • • 發佈:2017-11-10
perm pre 永久代 msi 字節碼 strong 講解 images 調用
一、內存結構圖
程序計數器
保存著當前線程執行的虛擬機字節碼指令的內存地址,使得保證線程切換回來後,還能恢復到原先狀態。(本地native豐富則計數器為空)
虛擬機棧(JVM棧)
每創建一個線程時就會對應創建一個Java棧,所以Java棧也是"線程私有"的內存區域,這個棧中又會對應包含多個棧幀,每調用一個方法時就會往棧中創建並壓入一個棧幀,棧幀是用來存儲方法數據和部分過程結果的數據結構,每一個方法從調用到最終返回結果的過程,就對應一個棧幀從入棧到出棧的過程。
我們平時說的堆棧堆棧,棧就是指代的這個JVM棧,堆在下文講解。
本地方法棧
與虛擬機棧類似,為本地方法服務。
方法區
用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
方法區中還存在著常量池,常量池包含著一些常量和符號引用(加載類的連接階段中的解析過程會將符號引用轉換為直接引用)。
堆
堆(heap)是存儲java實例或者對象的地方,是GC的主要區域,同樣是線程共享的內存區域。(進一步可以細分為新生代和老年代)
二、控制參數
-Xms設置堆的最小空間大小。 -Xmx設置堆的最大空間大小。 -XX:NewSize設置新生代最小空間大小。 -XX:MaxNewSize設置新生代最大空間大小。 -XX:PermSize設置永久代最小空間大小。-XX:MaxPermSize設置永久代最大空間大小。 -Xss設置每個線程的堆棧大小。
Java基礎——JVM內存結構