天天看點

【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:

以下為JDK1.8版本虛拟機運作時資料區的相關總結(OneNote截圖)。

文章目錄結構:

線程共享區域

     1 方法區

            1.1 運作時常量池(Runtime Constant Pool)

            1.2 元空間實作方法區

     2.堆(Heap) 

            2.1 新生代(Young Generation)

            2.2 老年代(Old Generation) 

            2.3 元空間(Meta Space) 

            2.4 字元串常量池(String Pool)

線程不共享區域

     3.虛拟機棧(Stack) 

            3.1 局部變量表

            3.2 操作數棧(Operand Stack)

            3.3 動态連結和指向運作時常量池的引用

            3.4 方法傳回位址

    4.本地方法棧(Native Method Stack) 

    5.程式計數器(Program Counter Register) 

【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:
【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:
【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:
【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:
【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:
【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:
【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:
【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:
【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:
【JVM筆記】運作時資料區(記憶體結構)線程共享區域線程不共享區域更正:

更正:

上文對新生代中進行GC的過程描述有歧義,重新更正一下 。

對象在From Survivor和To Survivor來回轉移的詳細過程

對象在Eden區建立,當Eden區第一次裝滿之後,會執行第一次Yong GC,第一次Yong GC會将伊甸區還存活的對象複制到Surviver區的“From”區,此時“To”區是空的。但是在以後伊甸區被裝滿後進行的Yong GC,會将Eden區還存活的對象直接移動到Surviver區的“To”區,而“Form”區的對象有兩個去處,“From”區的對象會根據經過的GC次數計算年齡,如果年齡到達了門檻值(預設15),則會被移動到老年代中,否則就轉移到“To”區,此時“From”區變成了空的,然後“From”區和“To”區進行角色互換,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。到下一次進行GC時,還是有一塊空的“To”區,用來存放從eden區和“From”區移動過來的對象。也就是不管怎樣,都會保證名為To的Survivor區域是空的。Yong GC會一直重複這樣的過程,直到“To”區被填滿,“To”區被填滿之後,會将所有對象移動到年老代中。