001. 深刻JVM學習—Java運行流程

1. Java運行流程圖

Java運行流程圖

2. Java運行時數據區

Java運行時數據區

3. Java虛擬機棧

  1. 棧內存是線程私有的,其生命週期和線程相同;函數

  2. 虛擬機棧描述的是Java方法執行的內存模型:執行一個方法時會產生一個棧幀隨後將其保存到棧(先進後出)的頂部,方法執行完畢後會自動將此棧幀進行出棧。頂部的棧幀就表示的是當前的方法;線程

    • 若是請求的棧的深度過大,虛擬機可能會拋出StackOverflowError異常,
    • 若是虛擬機的實現中容許虛擬機棧動態擴展,當內存不足以擴展棧的時候,會拋出OutOfMemoryError異常。
  3. 圖介紹3d

    Java虛擬機棧

  4. 棧幀主要組成成分指針

    • 局部變量表(Local Variables):方法的局部變量或形參,其以變量曹槽(solt)爲最小單位,只容許保存32位長度的變量,若是超過32位則會開闢兩個連續的solt(64位長度,long和double);
    • 操做數棧(Operand Stack):表達式計算在棧中完成;
    • 指向當前方法所屬的類的運行時常量池的引用(Reference to runtime constant pool):引用其餘類的常量或者使用String池中的字符串;
    • 方法返回地址(Return Address):方法執行後須要返回調用此方法的位置,因此須要在棧幀中保存方法返回地址。

4. Java內存管理

  1. JVM中的運行時數據區包括:對象

    • 程序計數器(Program Counter Register)
    • Java棧(Stack)
    • 本地方法棧(Native Method Stack)
    • 方法區(Method Area)
    • 堆(Heap)
  2. 棧是運行時的單位,而堆是存儲的單位。blog

    • 棧由於是運行單位,裏面存儲的信息都跟當前線程(或程序)相關的信息。包括局部變量、程序運行狀態、方法返回值等等;
    • 堆只是保存對象信息。
  3. 圖解遞歸

    Java內存管理

5. 相關知識

  1. JVM:Java虛擬機,全部程序都要求運行在JVM上,考慮到了可移植性問題。生命週期

  2. Java程序中能夠使用native關鍵字實現本地C函數的調用。可是這些都屬於程序運行的輔助手段,而真正的程序都運行在「運行時數據區」之中。內存

  3. 運行時數據區分爲如下幾個內存空間:字符串

    • 堆內存:保存全部引用數據類型的真實信息;
    • 棧內存:基本類型、運算、指向堆內存的指針;
    • 方法區:全部定義的方法的信息都保存在此區之中,此區屬於共享區;
    • 程序計數器:是一個很是小的內存空間,小到能夠忽略;
    • 本地方法棧:每一次執行遞歸的方法處理的時候實際上都會將上一個方法入棧
  4. Java之中存在對象池的概念,對象池是對整個常量的常量池的規則破壞,由於在JVM啓動的時候,全部常量都已經分配好空間,可是String中的intern()方法卻能夠打破限制,動態的進行常量池的內容設置。

相關文章
相關標籤/搜索