jvm----記憶體區域及物件(原創筆記)
阿新 • • 發佈:2020-10-12
(儘量以圖表形式總結)
記憶體區域
記憶體動態分配、垃圾收集技術是java與C++之間圍成的一堵高牆。
java虛擬機器HotSpot把其管理的記憶體分成不同用途的資料區,總結如下:
區域 | 要點分析 | 執行緒 | OutOfMemoryError |
---|---|---|---|
程式計數器 | 選取位元組碼指令,指示程式控制流 | 私有 | 無 |
虛擬機器棧 | 描述java方法執行的執行緒模型:建立棧幀用於儲存區域性變量表(包括基本資料 型別、物件引用)、運算元棧、動態連線、方法出口等資訊 為java方法執行服務 | 私有 | 有 |
本地方法棧 | 為本地(Native)方法執行服務,與虛擬機器棧功能相似 | 私有 | 棧深度溢位且有OOM |
堆 Heap | - 物件例項及陣列(棧上分配、標量替換、逃逸分析技術的發展,所有物件例項 -Xmx -Xms設定記憶體大小 | 共享 | 有 |
方法區 | - Non-Heap ,堆的邏輯部分,用於儲存型別資訊、常量、靜態變數、程式碼快取 - JDK 8後完 | ||
全放棄永久區概念,改為和JRockit、J9一樣的元空間 | 共享 | 有 | |
直接記憶體 | 非jvm資料區,通過Native函式庫分配堆外記憶體,作用是避免java堆和Native堆 資料來回複製 | – | 有 |
物件
建立過程
序號 | 步驟 | 描述 |
---|---|---|
1 | new | 定位類的符號引用,類載入(專門章節總結類載入過程) |
2 | 分配記憶體 | 即在java堆裡劃分記憶體。分配方式: 1)指標碰撞,記憶體指標挪動物件大小相等的舉例(Serial、ParNew) 2)空閒列表,jvm維護一個列表記錄那些記憶體可用,分配給物件例項(CMS基於清除演算法的收集器) |
3 | 必要設定 | 物件頭設定(偏向鎖,雜湊碼,GC分代年齡等) |
4 | 初始化 | init()方法執行。真正構造出物件來 |