一、Java記憶體模型
Java運行時資料區一般分為:程式計數器區、方法區、Java棧、Java本地棧、Java堆組成。
1、程式計數器
程式計數器是執行緒私有的一塊較小的記憶體區域, 用於保存當前執行緒執行位元組碼的行號指示器, 執行緒的切換、異常都能正確的恢復到指定的要執行的位元組碼位置都是這個行號指示器的功能, 這個區域是一個唯一一個沒有拋出OutOfMemoryError的異常。
2、Java棧
Java棧也是執行緒私有的一塊記憶體區域, 它的生命週期與執行緒的生命週期相同。 一個方法被執行的同時會創建一個棧幀, 將其壓入棧中, 方法執行完成的同時就會把此棧幀彈出棧,
3、方法區
方法區是所有執行緒共用的一片記憶體區域, 用於保存類資訊、方法名、靜態變數、常量等資訊。 我們也成為永久代。 常量池是方法區的一部分, 用於保存字面量和符號。
4、堆
堆這塊記憶體區域是最為重要的一片記憶體區域, 幾乎所有的物件實例都保存在此區域, 也是GC管理最重要的區域, 也成為GC堆。 堆也可以細劃分為:老年代和新生代。 JVM設置參數:
-Xms10M -Xmx100M 當申請的記憶體無法申請到足夠的記憶體的時候會出現OutOfMemoryError的異常資訊。
5、物件訪問
物件訪問也就是reference類型如 Object object = new Object;
Object object 這個反應到虛擬機器棧中的區域變數表中保存reference類型出現, new Object;這會出現在Java堆中將物件實例放在此記憶體區域, Object 類型的體現出這些資訊保存在方法區中。
reference類型資料訪問物件有兩種:
5.1、基於控制碼池
基於控制碼池的物件訪問方式是在Java堆中創建一個控制碼池, 控制碼池中保存堆中實例物件的記憶體位址,
5.2、直接記憶體位址
直接記憶體位址是reference類型的資料保存的就是Java堆中的所在的實例的位址。
6、直接記憶體
直接記憶體不是JVM中的運行時資料區的一部分, 這部分也會被頻繁的使用。 在JDK1.4中引入了NIO 基於通道和緩衝區的新的I/O, 可以使用本地函數直接在分配堆以外的記憶體, 在堆中保存一個DrectByteBuffer的直接記憶體的位址, 這樣操作可以避免了本地堆和Java堆來回複製資料的問題。 這要注意我們在配置Java堆參數的時候一定要考慮到直接記憶體所占記憶體的一部分。