1. 程式人生 > >深入理解JAVA虛擬機-筆記

深入理解JAVA虛擬機-筆記

edi 指令集 del loader 元素 屏障 進行 正常 ack

一、JVM

  是整個Java平臺的基石,是Java技術用於實現硬件與操作系統無關的關鍵部分,是保證用戶機器免於惡意代碼損害的屏障。

  可以被看做是一臺抽象的計算機。 有?己的指令集和運行時的內存區域。

  與Java語?言並沒有必然的聯系。

    只有特定的二進制文件格式-Class文件格式關聯。

    畢竟虛擬機其實只是一個程序,比我們寫的hello world牛點。

二、JVM的運?時內存區域劃分

  語?言級別內存劃分。

技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片

技術分享圖片

1. 線程私有

1.1. 程序計數器-pc 寄存器

  每個jvm線程都有?己的pc 計數器

  線程執?到的字節碼的行號指示器,只要不是native方法, ?於執行過程中的循環、跳轉、分?支、異常處理理線程恢復等。

  ?命周期與線程相同

1.2. 虛擬機棧- stack

  描述的是?法執行的內存模型,?法的執行過程就是虛擬機棧的入棧與出棧

  用於存儲局部變量和部分過程結果(些尚未算好的結果)的數據結構。

  也被用來處理動態鏈接、方法返回值和異常分派。

  生命周期與JVM線程相同,?法執?時都會創建?個棧幀。

  隨著?法調?而創建,隨著方法結束(?論正常還是異常完成)而銷毀。

  局部變量表和操作數棧都是在編譯期確定,在方法的code屬性中。

  1.2.1. 局部變量表

    存放在編譯時已經確定的8種基本類型、對象引用等。空間?小是確定的,

    在運行期間不會改變。

    ?法參數和局部變量

    局部變量 沒有 初始化階段,即不會被賦零值。

  1.2.2.操作數棧

    類似於數據寄存器
    方法開始執行時是空的, 運算過程中會有出棧入棧操作。

1.3. 本地方法棧?

  用來?持native?法執?

  native關鍵字說明其修的?法是一個原?態方法,方法對應的實現不是在當前文件,?是在?其他語?(如C和C++)實現的文件中

2. 線程共享

  2.1. 方法區

    是堆的一個邏輯部分 虛擬機啟動時創建,1.8 已經開始直接使?用本地內存,元 空間。

    存儲虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據。 類的 版本信息等 字段 方法 接口等。 常量池。- 運?行行時常量池。 類、實例例、接口初始化時?用 到的特殊方法。

    不嚴謹的說,包含整個程序永遠唯一的元素。

  2.2. Java 堆 -heap

    可供各個線程共享的運行時內存區域。

    最?的?塊 ?小可以是固定的,也可以是動態的。 虛擬機啟動時創建 幾乎所有對象與數組都在堆上分配。

    可能會劃分出多個線程私有的分配緩沖區 TLAB

  2.3 直接內存

    虛擬機規範外的內存區域,如NIO直接使?用的堆外內存。

三、內存回收特殊的內存模塊-不需回收或回收效率低

    線程私有的的內存:程序計數器、虛擬機棧、本地方法棧,隨著線程生滅,分 配和回收都是確定的。

    永生代,就是前?面說的方法區,回收的效率很低。 現已改為 元空間,直接使?用的是本地內存。回收的兩個內容為:

    1. 廢棄常量 沒有任何?人?用

    2. ?用的類 條件比較苛刻

      1. 該類的所有實例都已經被回收。
      2. 加載該類的ClassLoader已經被回收
      3. Class對象沒有任何地方被引用,無法在任何地方通過反射訪問該類

  1. 堆內存分代——有針對性的采?不同的回收機制,有利 於內存回收

    1.1. 年輕代和?年代      

      1. 年輕代對象朝生夕滅,

        一般劃分是 一個Eden區和兩個Survivor區。2. ?年代對象歷久彌堅

    1.2. 創建對象時的分配

      1. 對象優先分配到Eden區,經歷一定次數的回收之後,仍然存活的對象進?老年代。

      2. ?對象直接進??年代

  2. 內存回收

      2.1. GC 分類 - 何時回收

        1. Minor GC 發生在新生代的內存回收

          當jvm無法為一個新的對象分配內存空間時會觸發Minor GC,?如當Eden區滿了,或者內存不連續。

        2. Full GC 發生在?年代的回收

          如果?年代沒有?夠空間,就會進行一次Full GC 對新生代和?年代都進行GC

      2.2. 哪些對象可以回收

        2.2.1. 引?用計數算法

          為對象添加引?用計數器,每個引?用計數+1,引?用失效,計數-1.會有循環引?用.

        2.2.2. 可達性分析

          通過一系列列的 GC Roots 對象作為起始點,搜索所?走過的路路徑稱為引?用鏈。

          當一個對象沒被引?用的時候,就判定為可回收對象。

            GC Roots:

              1. 虛擬機棧中引?用的對象
              2. 方法區中類靜態屬性引?用的對象

              3. 方法區中常量引?用的對象
              4. 本地方法棧中引?用的對象

  3. 如何回收 - 回收算法介紹

    3.1 年年輕代回收算法

        3.1.1 標記-清除

          標記出所有需要回收的對象

          統一回收所有被標記的對象

          不?:

            效率,標記和回收的效率都不高

            空間,會產生大量的離散的內存碎片


        3.1.2 復制  

          空間換效率 新生代基本都采?用這種算法。

          將還存活的對象復制到另一塊內存上,其他的一次性清理掉。Eden和2 個 Survivor

          HotSpot 默認是 8:1:1
          如果 10% 不夠放置存活的對象,則直接進入老年代。


    3.2 ?年代算法

      3.2.1 標記-整理

        ?年代,一般就是對象存活率比較高。 ?而彌堅。

        與標記清理類似,但是不清理,而是讓存活的對象移動到一端,

深入理解JAVA虛擬機-筆記