1. 程式人生 > 其它 >Java-JVM-垃圾回收器

Java-JVM-垃圾回收器

垃圾回收器都有那些?

單執行緒垃圾回收器:Serial、Serial Old

多執行緒垃圾回收器:ParNew、Parallel、Parallel Old

併發垃圾回收器:CMS,G1

你最瞭解那一款垃圾回收器

都知道一點吧,比如說單執行緒的Serial、SerialOld,適合用在一些單核的CPU中,比如說一些嵌入式

然後ParNew的話是一個獨立的年輕代的垃圾回收器,是第一款多執行緒的垃圾回收器,是Serial的多執行緒的的版本

隨後就是 Parallel 是JDK8中的預設的垃圾的回收器,以吞吐量優先的的垃圾回收器

再然後就是CMS,這是在JDK 1.5的時候推出的劃時代的併發回收器,第一次實現了垃圾收集執行緒和使用者執行緒同時的工作。關注點在於如何更好的停頓時間,在一些伺服器端會帶來更好的體驗

隨後就是在JDK1.7的u4版本中可用的G1垃圾回收器,以良好的吞吐量為優先,目標是在低延遲的情況下得到更好的吞吐量,擔任的全功能的垃圾回收期

你瞭解CMS的垃圾回收演算法嗎?

CMS是一個併發的垃圾回收器,所以說,大概有以下這幾個過程

  • 初始化標記階段,標記處GC Roots
  • 併發標記階段,這個階段會根據GC Roots進行向下標記,但是並不會造成STW
  • 重新標記階段,這個階段可能會造成一些垃圾回收的浮動垃圾,於是就會進行重新的標記
  • 垃圾清除階段:這個是一個併發的清除的過程,所以說採用的是標記清除演算法,如果使用壓縮,以防止干擾使用者執行緒

那G1的垃圾回收演算法呢

G1垃圾回收是基於Region分割槽的,它把整個堆在邏輯上拆分成了老年代、年輕代,隨後避免全堆的收集,有一個可以遇見的時間模型,根據一個優先的列表在執行收集的時間內。優先回收價值比較大的Region,所以說也就叫垃圾優先,G first。

他的垃圾回收主要分為

  • 年輕代gC
  • 老年代的併發標記
  • 混合回收
  • 還有獨佔的、單執行緒的Full GC

年輕代的GC主要有

  • 掃描根
  • 更新Result集合
  • 處理RSet集合
  • 複製物件
  • 處理引用

併發標記的過程有

  • 初始化標記階段:這個階段會觸發一次年輕代的GC
  • 根區域掃描
  • 併發標記
  • 再次標記
  • 獨佔清理
  • 併發清理

Full GC
如果上述的垃圾演算法都無法滿足,那麼就會觸發Full GC,Full GC 會造成長時間的程式停頓