前段時間沒有好好準備,錯過了“金三銀四”,因此最近開始惡補各方面知識,決定先從JVM記憶體結構和GC開始。 JVM記憶體結構分為如下幾部分(前兩項為線程共用,後三項為線程私有的): 1、方法區:存儲已經被虛擬機載入的類信息、常量、JIT(及時編譯器Just In Time)編譯後的代碼以及類變數(sta ...
前段時間沒有好好準備,錯過了“金三銀四”,因此最近開始惡補各方面知識,決定先從JVM記憶體結構和GC開始。
JVM記憶體結構分為如下幾部分(前兩項為線程共用,後三項為線程私有的):
1、方法區:存儲已經被虛擬機載入的類信息、常量、JIT(及時編譯器Just In Time)編譯後的代碼以及類變數(static修飾的變數)。
2、堆記憶體:JVM中最大的記憶體區域,Java運行時創建的所有對象幾乎都存在於此,並且還是GC的重點照顧區域,除此之外還存0有實例變數。
3、虛擬機棧:生命周期與線程相同,方法執行時創建棧幀這種數據結構,存放局部變數表、操作站、動態鏈接、方法出口等信息。棧幀的大小代表虛擬機棧的寬度,數量代表深度。
4、本地方法棧:調用本地方法的介面(JNI),網路通信、文件操作的底層。
5、程式計數器:存放當前線程接下來將要執行的位元組碼指令,分支、迴圈、跳轉、異常處理等信息。
垃圾回收部分:
HotSpot VM分為了年輕代(Young)、老年代(Tenured)和永久區(Perm)。年輕代又被分為1個Eden區和兩個Survivor區(分別叫From和To),其中Eden是對象的出生地,每經歷一次GC並且存活下來則“年齡”增長一歲,進行至少一次GC並且存活下來後進入Survivor區,而若到了指定的年齡(預設是15歲)仍未回收,則有機會進入老年代。
回收演算法:
1、標記 — 清除演算法:分為兩階段:第一階段先從引用根節點開始標記所有被引用的對象,第二階段遍歷整個堆,把未標記的對象清除。需要暫停整個應用,但是會產生記憶體碎片。
2、複製演算法:將記憶體分為兩個區域,使用的只有其中一個區域,當進行垃圾回收時,遍歷正在使用的區域,直接將所有存活對象複製到未使用的區域中,因此是進行垃圾回收的同時也進行了記憶體整理,不會出現記憶體碎片問題。
3、標記 — 整理演算法:此演算法結合了以上兩種演算法,也是分為兩階段,第一階段從根節點開始標記所有被引用對象,第二階段遍歷整個堆,消除未標記對象並且把存活對象“壓縮”到堆的一頭,按順序排放,避免了標記 — 清除演算法的碎片問題,同時也避免了複製演算法的空間問題。