JVM內存劃分

Java源代碼文件(.java)--->通過編譯成字節碼文件(.class)--->而後通過JVM的各類類加載器將字節碼文件加載到內存當中
--->加載完畢後由JVM執行引擎執行。在整個程序的執行過程當中,JVM會用一段空間來存儲執行期間所須要用到的數據,這段
空間被稱爲運行時數據區域(Runtime data area),也就是咱們所說的JVM內存區域,平時咱們所說的JVM內存管理,其實就是
針對Runtime data area區域進行管理和優化。java

JVM內存區域的劃分:
1. 堆(Heap)
在Java中堆是用來存放對象的,GC主要就是來管理回收堆內存,堆是被全部對象共享的,在JVM中只有一個.
2. 棧(VM Stack)
局部變量表:指在方法中聲明的非靜態變量和方法的形參,對於基本數據類型的變量,直接存儲它的值,對於引用類型
存的是指向對象的引用.局部變量表在編譯期間就已經肯定大小了,所以在程序運行期間局部變量表的
大小是不會改變的.
操做數棧:
程序在方法中執行的過程就是在不斷的賦值取值和計算,而這些操做都是藉助操做數棧來完成的.
指向運行時常量池的引用:
在方法執行的過程當中碰到的常量,這個引用就是指向運行時常量池的.
方法的返回地址:
當一個方法執行完畢後,要返回以前調用它的地方,所以在棧幀中須要保存一個方法的返回地址.
每一個線程都會有本身的棧,互不干擾.
3. 方法區
跟堆同樣被全部線程共享,此區域存儲了每一個類的信息(包括類的名稱、方法信息、字段信息)、靜態變量、
常量以及編譯器編譯後的代碼等.
4. 本地方法棧
跟棧的做用和原理相似,棧是爲java方法服務,而本地方法棧是爲native方法服務的,在HotSpot虛擬機中棧和
本地方法棧指的是同一塊內存區域.
5. 程序計數器(PC寄存器)
這塊內存保存的是程序當前執行的指令的地址,當CPU須要執行指令時,須要從程序計數器中獲得當前須要執行的
指令所在存儲單元的地址,而後根據獲得的地址獲取到指令,在獲得指令以後,程序計數器便自動加1或者
根據轉移指針獲得下一條指令的地址,如此循環,直至執行完全部的指令.每一個線程都會有本身獨立的程序計數器,
而且不相互影響,在JVM規範中規定,若是線程執行的是native方法,那麼程序計數器保存的值是undefined.還有就是
程序計數器中內存的數據所佔用的空間大小不會隨着程序的執行而改變,所以對於程序計數器這塊內存是不會發生
OOM的.
優化

相關文章
相關標籤/搜索