1. 程式人生 > >筆記三(垃圾收集器與記憶體分配策略)

筆記三(垃圾收集器與記憶體分配策略)

1 物件已死?

  堆中幾乎存放著Java世界中所有的物件例項,垃圾收集器在對堆進行回收前,

  第一件事情就是要確定這些物件哪些還“存活”著,哪些以及“死去”(即不可能再被任何途徑使用的物件)。

1-1 引用計數演算法

  目的:判斷物件是否存活

  方法:給物件中新增一個引用計數器,每當有一個地方引用它時,計數器值就加1 ;

            當引用失效時,計數器值就減1;任何時刻計數器都為0 的物件就是不可能再被使用的,也就是死去的物件。

  缺點:它很難解決物件之間的相互迴圈引用的問題,所有Java語言沒有選擇引用計數演算法來管理記憶體。

1-2 根搜尋演算法

  目的:判斷物件是否存活

  方法:通過一系列的名為“GC Roots”的物件作為起始點,從這些節點開始向下搜尋,搜尋所走過的路徑稱為引用鏈(Refenence Chain),當一個物件到GC Roots沒有任何引用鏈相連時(不可達),則證明此物件是不可用的。

  GC Roots物件:

   * 虛擬機器棧中的引用的物件

   * 方法區中的類靜態屬性引用的物件

   * 方法區中的常量引用的物件

   * 本地方法棧中JNI(Native方法)的引用的物件

2 引用型別:

強引用》》軟引用(SoftReference)》》弱引用(WeakReference)》》虛引用(PhantomReference)

3 分代收集演算法

  根據物件的存活週期的不同將記憶體劃分為幾塊。

  新生代:複製演算法  (大批量死去 少量存活)

 老年代:標記-清理演算法   標記-整理演算法(物件存活率高、沒有額外空間對它進行分配擔保。

4 Minor GC 和 Full GC 的區別

    * 新生代GC(Minor GC):指發生在新生代的垃圾收集動作,因為Java物件大多都具備朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度也比較快。

   * 老年代GC (Major GC/Full GC):指發生在老年代的GC,出現了Major GC,經常會伴隨著至少一次的Minor GC。Major GC的速度一般會比Minor GC慢10倍以上。