Java虛擬機的內存模型

Java虛擬機的內存模型

java虛擬機的內存模型

內存區域名稱 英文名稱 作用 批註 可能的異常 線程共享與否
程序計數器 Program Counter Register 當前線程鎖執行的字節碼的行號指示器 對於Java方法,記錄的是正在執行的虛擬機字節碼指令的地址,對於Natice方法,計數器值爲空 線程私有,對於每一個線程都具有自己的一個計數器用於在線程切換情況下的恢復
Java虛擬機棧 Java Virtual Machine Stacks Java方法的執行內存模型 每個java方法會對應一個棧幀,存放局部變量表,操作數棧,動態鏈接,方法出口 StackOverflowError:如果申請的棧深度大於虛擬機所允許的深度,OutOfMemoryError:如果動態拓展時無法申請到足夠的內存 線程私有,與線程生命週期相同
本地方法棧 Native Method Stacks Native方法執行的內存模型 同上 同上 同上
Java堆 Java Heap 用於存放對象實例 1.數組也是在堆上進行分配的2.Java8中字符串常量池被放入堆中3.分爲新生代和老生代 OutOfMemoryError:堆中沒有內存進行實例分配並且不能在進行動態拓展時 所有線程共享
方法區 Method Area 存儲虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼 1所謂的永久代2可以不進行垃圾收集的區域,垃圾回收效果一般不好 OutOfMemoryError:堆中沒有內存進行實例分配並且不能在進行動態拓展時 所有線程共享
運行時常量池 Runtime Constant Pool 方法區的一部分,用於存放編譯期生成的各種字面量和符號引用 OutOfMemoryError:堆中沒有內存進行實例分配並且不能在進行動態拓展時 所有線程共享
直接內存 Direct Memory 不是java虛擬機運行時數據區的一部分,稱爲堆外內存 OutOfMemoryError:各個內存區域總和大於物理內存限制

解決對象分配時併發問題的兩種方法

  1. 對分配內存空間的動作進行同步處理,可採用CAS配上失敗重試的方式保證更新的原子性
  2. 使用TLAB(Thread Local Allocation Buffer)本地線程分配緩衝來進行分配

HotSpot虛擬機對象中包含的內容

名稱 英文名稱 作用 包含內容
對象頭 Header 包含有關該對象的屬性信息 1.MarkWord:自身運行時數據:哈希碼、GC分代年齡、鎖狀態標誌、線程持有的鎖、偏向線程ID、偏向時間戳。2.類型指針:該對象指向其類元數據的指針,用於表示該對象是哪個類的實例。3.如果是數組,則還包含數組的長度
實例數據 Instance Data 即對象中實際存放的數據 對象中的實例數據
對齊填充 Padding 用於進行2K或者4K對齊的填充部分 無實際意義的空白填充
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章