淺析JVM內(nèi)存模型

  • Java虛擬機內(nèi)存
    ???Java虛擬機在執(zhí)行Java程序的時候會將它管理的內(nèi)存分為若干個不同的數(shù)據(jù)區(qū)域焙压。不同的區(qū)域用途也各不相同熔任,具體內(nèi)存模型圖如下圖所示:
    Java內(nèi)存模型.png

    ??其中橙色部分為線程私有的數(shù)據(jù)區(qū)域,藍色部分為線程共享的數(shù)據(jù)區(qū)域
    程序計數(shù)器
    ??程序計數(shù)器是一塊較小的內(nèi)存空間,主要記錄當前線程執(zhí)行的虛擬機字節(jié)碼地址,如果執(zhí)行的是Native方法,則程序計數(shù)器值為空鱼冀。
    虛擬機棧
    ??虛擬機棧描述的是Java方法的內(nèi)存模型:每個方法在執(zhí)行的時候都會創(chuàng)建一個棧幀,用來存儲局部標量表悠就、操作數(shù)棧千绪、動態(tài)鏈接、方法出口等信息
    本地方法棧
    ??本地方法棧與虛擬機棧作用相似梗脾,不同的是本地方法棧是用于描述Native方法的內(nèi)存模型

    ??Java堆是Java虛擬機所管理內(nèi)存中最大的一塊荸型,也是被所有線程共享的一塊內(nèi)存區(qū)域,該區(qū)域主要是存放對象實例炸茧。Java堆也是垃圾收集器的主要區(qū)域瑞妇,從內(nèi)存回收的角度來看,由于現(xiàn)在收集器基本都采用分代收集算法梭冠,所以Java堆還可以細分為新生代和老年代辕狰,再細致一點的有Eden空間、From Survivor空間控漠、To Survivor空間等
    方法區(qū)
    ??方法區(qū)也是被各個線程共享的內(nèi)存區(qū)域蔓倍,主要用于存儲被虛擬機加載的類信息、常量靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)
  • Java虛擬機是如何操作這些區(qū)域的

結(jié)合代碼重點了解一下JVM運行時數(shù)據(jù)區(qū)偶翅,主要是虛擬機棧的分析

com.kons;

public class Test{
   public static void main(String[] args){
       int a=1;
       int b=2;
       int c=add(a,b);
   }
   
   public static int add(int a,int b){
       return a+b;
   }
}

首先Test類被編譯成class文件他去,通過類加載子系統(tǒng)加載到內(nèi)存中。然后倒堕,JVM會給執(zhí)行的線程分配程序計數(shù)器、虛擬機棧爆价、以及本地方法棧垦巴,如圖所示:

虛擬機棧.png

當執(zhí)行main方法的時候,會給main方法創(chuàng)建一個棧幀壓入虛擬機棧中铭段,同理骤宣,當執(zhí)行到add方法時也是如此,如圖所示:

入棧.png

棧幀內(nèi)部主要由局部變量序愚,操作數(shù)棧憔披,動態(tài)鏈接以及方法出口等及部分組成,接下來結(jié)合class文件了解一下爸吮,這個棧幀具體是怎么工作的芬膝。

打開class文件所在文件夾,通過javap命令查看class文件

javap -c Test.class >test.txt

代碼如圖所示:

Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static int add(int, int);
    Code:
       0: iload_0
       1: iload_1
       2: iadd
       3: ireturn

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: invokestatic  #2                  // Method add:(II)I
       9: istore_3
      10: return
}

執(zhí)行流程

iconst_1:將整數(shù)1推到操作數(shù)棧上
istore_1:棧頂元素出棧并存入局部變量表1號位
iconst_2:將整數(shù)2推到操作數(shù)棧上
istore_2:棧頂元素出棧并存入局部變量表2號位

stack.png

iload_1:將局部變量表1號位元素放入棧頂
iload_2:將局部變量表2號位元素放入棧頂

iload.png

invorkestatic:調(diào)用靜態(tài)方法add形娇,該指令將彈出棧頂數(shù)據(jù)作為方法的參數(shù)并放入add棧幀中的局部變量表中

add.png

iload_0,iload_1:將局部變量表的數(shù)據(jù)壓入操作數(shù)棧

add_load.png

執(zhí)行到iadd的時候锰霜,操作數(shù)棧將數(shù)據(jù)相加并壓入棧,執(zhí)行完后桐早,通過方法出口返回到main方法癣缅,并將add棧幀彈出虛擬機棧,最后通過istore指令將返回的數(shù)據(jù)存入局部變量表中

return.png

參考資料
《深入Java虛擬機》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哄酝,一起剝皮案震驚了整個濱河市友存,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陶衅,老刑警劉巖屡立,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異万哪,居然都是意外死亡侠驯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門奕巍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吟策,“玉大人,你說我怎么就攤上這事的止¢菁幔” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匾委。 經(jīng)常有香客問我拖叙,道長,這世上最難降的妖魔是什么赂乐? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任薯鳍,我火速辦了婚禮,結(jié)果婚禮上挨措,老公的妹妹穿的比我還像新娘挖滤。我一直安慰自己,他們只是感情好浅役,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布斩松。 她就那樣靜靜地躺著,像睡著了一般觉既。 火紅的嫁衣襯著肌膚如雪惧盹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天瞪讼,我揣著相機與錄音钧椰,去河邊找鬼。 笑死符欠,一個胖子當著我的面吹牛演侯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播背亥,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秒际,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狡汉?” 一聲冷哼從身側(cè)響起娄徊,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盾戴,沒想到半個月后寄锐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡尖啡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年橄仆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衅斩。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡盆顾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出畏梆,到底是詐尸還是另有隱情您宪,我是刑警寧澤奈懒,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站宪巨,受9級特大地震影響磷杏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捏卓,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一极祸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怠晴,春花似錦贿肩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汤功。三九已至物邑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滔金,已是汗流浹背色解。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留餐茵,地道東北人科阎。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像忿族,于是被迫代替她去往敵國和親锣笨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354