天天看點

談談你對垃圾回收機制的了解?一, 垃圾回收機制二、常見的垃圾回收器

一, 垃圾回收機制

在系統運作過程中會産生一些無用的對象,這些對象一直占用記憶體,不清理這些無用的對象可能會導緻記憶體耗盡,所有垃圾回收機制的是記憶體.

  • 垃圾收集的原理和概念

對于對象執行個體收集.主要有兩種基本算法,引用計數算法,可達性分析。

  • 引用計數算法:就是為對象添加一個引用計數,用于計數對象被引用的情況,如果計數為0,表示 對象可以被回收.(java并沒有選擇引用計數,因為存在一個基本難題,就是很難處理循環引用關系)
  • 可達性分析:這種類型的垃圾收集通常叫做跟蹤性垃圾收集器。

原理很簡單,就是将對象即及引用關系看着一個圖。標明活動對象作為 GC Roots,然會跟蹤引用鍊,如果一個對象和GC Roots之間不可達,也就是說不存在引用鍊,那麼即可認為是2可回收對象。jvm會把虛拟機棧和本地方法棧中正在引用的對象、靜态屬性引用的對象和常量,作為 GC Roots。

  • 垃圾搜集的算法主要有三種,分别是标記-清除算法、複制算法、标記-整理算法。

1.标記 - 清除(Mark-Sweep)算法,首先進行标記工作,辨別出所有要回收的對象,然後進行清除。這麼做除了标記、清除過程效率有限,另外就是不可避免的出現碎片化問題,這就導緻其不适合特别大的堆;否則,一旦出現 Full GC,暫停時間可能根本無法接受。

2.複制(Copying)算法,我前面講到的新生代 GC,基本都是基于複制算法,過程就如專欄上

一講所介紹的,将活着的對象複制到 to 區域,拷貝過程中将對象順序放置,就可以避免記憶體

碎片化。這麼做的代價是,既然要進行複制,既要提前預留記憶體空間,有一定的浪費;另外,對于 G1這種分拆成為大量 region 的 GC,複制而不是移動,意味着 GC 需要維護 region 之間對象

引用關系,這個開銷也不小,不管是記憶體占用或者時間開銷。

3 .标記 - 整理(Mark-Compact),類似于标記 - 清除,但為避免記憶體碎片化,它會在清理過

程中将對象移動,以確定移動後的對象占用連續的記憶體空間。

二、常見的垃圾回收器

1. Serial收集器

新生代單線程收集器,标記和清理都是單線程,優點是簡單高效。是client級别預設的GC方式。

2. Serial Old收集器

老年代單線程收集器,Serial收集器的老年代版本。

3. ParNew收集器

新生代收集器,可以認為是Serial收集器的多線程版本,在多核CPU環境下有着比Serial更好的表現。

4. Parallel Scavenge收集器

并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般為99%, 吞吐量= 使用者線程時間/(使用者線程時間+GC線程時間)。适合背景應用等對互動相應要求不高的場景。是server級别預設采用的GC方式。

5. Parallel Old收集器

Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量優先。

6. CMS(Concurrent Mark Sweep)收集器

高并發、低停頓,追求最短GC回收停頓時間,cpu占用比較高,響應時間快,停頓時間短,多核cpu 追求高響應時間的選擇。