深入Java虛擬機器閱讀感-Java記憶體各個區域的描述(一)
Java虛擬機器管理的記憶體資料模型如下:
1.程式計數器
程式計數器(Program counter Register)是程式執行位元組碼的行號指示器,每個執行緒都有獨立的程式計數器,當執行其他執行緒切換到執行執行緒時從當前的執行緒計數器當中獲取當前執行位元組碼的行號繼續執行。如果程式計數器正在執行Java方法則記錄當前位元組碼地址,如果執行的是Native方法則程式計數器為Undefined。程式計數器也是在Java虛擬機器規範當中唯一一個規定任何OutOfMemoryError區域。
2.java虛擬機器棧
java虛擬機器棧也是執行緒私有的。主要儲存有byte,short,int,long,boolean,chart,float,double以及物件引用地址。
在虛擬機器棧中double和long兩個64位資料將佔用兩個臨時變數空間。其他的各自佔用1個變數空間(slot)
Java虛擬機器棧在程式執行期間能夠丟擲兩種錯誤,StatckOverflowError超過棧的深度丟擲,當申請記憶體時記憶體不足時也會丟擲OutOfMemoryError記憶體溢位錯誤。
3、本地方法棧
在不同的虛擬機器當中有個不同的定義。在HotSpot虛擬機器當中將本地方法棧和虛擬機器棧二合一。本地方法棧與虛擬機器棧有著相似的作用。也會丟擲StatckOverflowError和OutOfMemoryError錯誤。
4、Java堆
Java堆是 虛擬機器管理記憶體當中最大的一個區域。Java當中絕大部分物件與陣列都需要在堆中申請記憶體。
Java堆是垃圾回收器主要的管理區域。也叫(GC堆)。Java堆可以細分為年輕代,老年代,如果在這個基礎上再進行細分則可以分為:Eden空間,From Survivor空間等。Java堆空間在物理空間上可以不連續,但是在邏輯上必須是連續的。
虛擬機器可以指定堆的大小引數為(-Xmx -Xms)
5、方法區
方法區與Java堆相似,是所有執行緒的共享區域。主要儲存有靜態變數,類載入資訊,常量,編譯器動態編譯的位元組碼資訊等。
6、執行時常量池
執行時常量池是方法區的一部分,主要儲存了類的版本號,欄位,方法介面描述等資訊。
7、直接記憶體
直接記憶體指實體記憶體大小,該區域也會發生記憶體溢位錯誤。主要原因是受限於實體記憶體大小;