JVM組成以類載入方式(雙親委派機制)、jvm垃圾回收

敲出快樂發表於2020-10-09

JVM組成

  • 本地庫介面、執行引擎、執行時資料區、類載入子系統

執行時資料區:

  • 堆(所有執行緒共享),元空間(所有執行緒共享),虛擬機器棧(執行緒隔離)、本地方法棧(執行緒隔離)、程式計數器(執行緒隔離)
    堆區:
  • 新生代(eden,s0,s1)、老生

雙親委派:

我們的程式本來是要通過應用類載入器來載入,但是它不會優先載入,它會先委託給他的父親(擴充套件類載入器),它的父親再委託給啟動類載入器,也就是委託給它的兩個親人。所謂就叫雙親委派。有載入規則,優先使用爺爺載入,如果沒有載入到再使用它爹載入,如果他爹也沒有載入到,才到自己載入,如果自己也沒有載入到才報ClassNotFountException。再這過程中只要上一級載入到了,下一級就不會載入了。

目的:不讓我們輕易覆蓋系統提供功能
也要讓我們擴充套件我們功能。

jvm垃圾回收

首先判斷物件是否已死; 是否為垃圾
使用:

  • 引用計數演算法
  • 可達性分析演算法:看物件與垃圾收集的起點GC Roots之間沒有可達路徑,沒有就是已經死了。就可以進行回收。
    選擇垃圾收集演算法:進行垃圾回收
    常見的幾種回收演算法:
  • 標記-清除演算法:分為標記和清除兩個階段,首先標記出所有需要回收的物件,標記完成後統一回收所有被標記的物件
  • 複製演算法:把記憶體分為大小相等的兩塊,每次儲存只用其中一塊,當這一塊用完了,就把存活的物件全部複製到另一塊上,同時把使用過的這塊記憶體空間全部清理掉,往復迴圈
  • 缺點:實際可使用的記憶體空間縮小為原來的一半,比較適合
  • 標記-整理演算法:先對可用的物件進行標記,然後所有被標記的物件向一段移動,最後清除可用物件邊界以外的記憶體
  • 分代收集演算法:把堆記憶體分為新生代和老年代,新生代又分為Eden區、From Survivor和To Survivor。一般新生代中的物件基本上都是朝生夕滅的,每次只有少量物件存活,
  • 新生代因此採用複製演算法,只需要複製那些少量存活的物件就可以完成垃圾收集;
  • 老年代中的物件存活率較高,就採用標記-清除或者標記整理演算法來進行回收。

相關文章