JVM與GC(一)

JVM運行時數據區域

圖片描述

名詞解釋html

  • 程序計數器(Program Counter Register):線程私有,存儲每一個線程的JVM指令,不存儲native方法內容。方法報錯的時候異常棧能告訴在代碼的哪一行,就是程序計數器的功能。
  • 虛擬機棧(VM Stack):每一個線程私有,存儲方法調用棧和線程局部基本類型變量。棧幀保存對堆內對象的引用。
  • 堆(Heap):線程共享,存儲對象實例,GC就是回收這一部分。因爲堆區域線程共享,對象在堆中分配須要加鎖,這個操做增大開銷,因此會先作逃逸分析,將線程本地小對象嘗試在TLAB(Thread Local Allocation Buffer)中分配,若是不能纔去堆中的Eden分配。TLAB默認是Eden的1%,大對象在TLAB放不下,就在Eden分配了,因此多個小對象可能比一個大對象分配要快。
  • 運行時常量池(Runtime Constant Pool):在方法區中分配,類的常量信息,方法引用信息,字符串常量等。

堆內結構

clipboard.png

簡單地說,新對象出生在Eden,若是Eden不夠了,觸發gc(Minor GC)把存活的對象搬到s0,下次gc又搬到s1,再下次又搬到s0,如此往復,一個對象被搬到必定次數就是幾歲,達到這個閾值就進入老年代。(默認15歲,就是一個狗狗的壽命)老年代滿了也會gc(Major GC/Full GC)算法

GC算法

  • Mark-Sweep 標記清除算法

顧名思義,兩個階段,先標記不被引用的對象,再清除掉,騰出內存。就像把圍棋裏被吃掉的棋子提出來。
缺點:空間碎片多spa

  • Copying 複製算法

把空間等分兩塊,一塊滿了將全部活着的對象複製到另外一個塊空間,再一次清理掉以前的空間。
優勢:解決了碎片問題
缺點:可用內存變低了線程

  • Mark-Compact 標記整理算法

標記以後,把存活的對象都移動到內存一端,把端邊界之外的內存空間清理掉。
沒有碎片,也能充分利用內存空間。老年代一般使用這種算法。htm

回收目標

引用計數爲空的對象:每一個對象有引用計數器,有引用就+1,引用失效就-1,爲0則不可能再被使用。
GC root引用鏈搜索不到的對象:以GC root的對象爲起點,沿它的引用搜索,引用鏈中搜索不到的對象也不會被使用。對象

參考文章:
https://www.cnblogs.com/zhouy...
https://www.cnblogs.com/wjtai...blog

相關文章
相關標籤/搜索