JVM記憶體模型

2022-09-19 10:33:10 字數 1579 閱讀 9273

1:程式計數器

2:虛擬機器棧

jvm棧是執行緒私有的記憶體區域。它描述的是j**a方法執行的記憶體模型,每個方法執行的同時都會建立乙個棧幀(stack frame)用於儲存區域性變數表、運算元棧、動態鏈結、方法出口等資訊。每個方法從呼叫直至完成的過程,都對應著乙個棧幀從入棧到出棧的過程。每當乙個方法執行完成時,該棧幀就會彈出棧幀的元素作為這個方法的返回值,並且清除這個棧幀,j**a棧的棧頂的棧幀就是當前正在執行的活動棧,也就是當前正在執行的方法。就像是組成動畫的一幀一幀的,方法的呼叫過程也是由棧幀切換來產生結果。

區域性變數表存放了編譯器可知的各種基本資料型別(int、short、byte、char、double、float、long、boolean)、物件引用(reference型別,它不等同於物件本身,可能是乙個指向物件起始位址的引用指標,也可能是指向乙個代表物件的控制代碼或其他與此物件相關的位置)和returnaddress型別(指向了一跳位元組碼指令的位址)。

在jvm規範中,對這個區域規定了兩種異常情況:如果執行緒請求的棧深度大於虛擬機器允許的深度,將丟擲stackoverflowerror異常;如果虛擬機器棧可以動態擴充套件,在擴充套件時無法申請到足夠的記憶體,就會丟擲outofmemoryerror異常。

3:本地方法棧

本地方法棧和虛擬機器棧所發揮的作用是很相似的,它們之間的區別不過是虛擬機器棧為虛擬機器執行j**a方法(位元組碼)服務,而本地方法棧則為虛擬機器使用到的native方法服務。sun hotspot 直接就把本地方法棧和虛擬機器棧合二為一。本地方法棧也會丟擲stackoverflowerror和outofmemoryerror異常。

4:堆(heap)

heap是oom故障最主要的發源地,它儲存著幾乎所有的例項物件,堆由垃圾收集器自動**,堆區由各子執行緒共享使用;通常情況下,它占用的空間是所有記憶體區域中最大的,但如果無節制地建立大量物件,也容易消耗完所有的空間;堆的記憶體空間既可以固定大小,也可執行時動態地調整,通過引數-xms設定初始值、-xmx設定最大值。

5:方法區

方法區是被所有執行緒共享的記憶體區域,用來儲存已被虛擬機器載入的類資訊、常量、靜態變數、jit(just in time,即時編譯技術)編譯後的**等資料。執行時常量池是方法區的一部分,用於存放編譯期間生成的各種字面常量和符號引用。(包括:型別資訊、型別的常量池、字段資訊、方法資訊、類變數、指向類載入器的引用、指向class例項的引用、方法表)

通過反射獲取到的型別、方法名、欄位名稱、訪問修飾符等資訊就是從方法區獲取到的。在使用到cglib對類進行增強時,增強的類越多,就需要越大的方法區類儲存動態生成的class資訊,當存放方法區資料的記憶體溢位時,會報outofmemoryerror異常。在jdk1.8中也就是metaspace記憶體溢位,可以通過引數jvm引數-xx:metaspacesize和-xx:maxmetaspacesize設定metaspace的空間大小。jdk1.8後方法區(method area)被元空間(metaspace)代替。

jvm記憶體模型 JVM記憶體模型詳情解析

一 結構圖 note string常量池 存在 堆記憶體中 二 各部分詳情解析 1 堆1 老年代 物件年齡 經過一次 monitor gc 年齡加1 15 的會存到 老年代 2 年輕代 3 常量池 string常量 儲存在堆中 2 虛擬機器棧 1 區域性變數表 2 運算元棧 3 動態鏈結 4 方法出...

jvm記憶體模型

主要分為棧,堆,方法區,程式計數器 1.程式計數器 2.棧 stack 虛擬機器棧 每個執行緒獨生成乙個棧,執行緒中每呼叫乙個方法生成乙個棧幀,棧幀依次壓棧 棧幀中存放了每個方法的基本資料變數,物件的引用,操作指令,出口資訊等 本地方法棧 存放的是native方法 其他語言寫的 其他和虛擬機器棧一樣...

jvm記憶體模型

補充 可見性 乙個執行緒修改了變數,其他執行緒可以立即知道 保證可見性的方法 volatile synchronized unlock之前,寫變數值回主存 final 一旦初始化完成,其他執行緒就可見 有序性 在本執行緒內,操作都是有序的 重排或 主記憶體同步延時 指令重排 執行緒 內序列語義 寫後...