文章目錄
- 分代收集算法:
- 新生代(Young Generation)
- 老年代(Old Generation)
- 垃圾回收器:
- JVM常見三大回收算法:
- Mark-Sweep(標記清除)
- 優點:
- 缺點:
- 復制算法
- 優點:
- 缺點:
- Mark-Compact(標記壓縮)
- 優點:
- 缺點:
- 四種引用類型:
分代收集算法:
新生代(Young Generation)
回收時先將 Eden 區存活對象復制到一個 Survivor0 區,然后清空 Eden 區,當這個 Survivor0 區也存放滿了時,則將 Eden 區和 Survivor0 區存活對象復制到另一個 Survivor1 區,然后清空 Eden 和這個 Survivor0 區,此時 Survivor0 區是空的,然后將 Survivor0 區和 Survivor1 區交換,即保持 Survivor1 區為空, 如此往復。當 Survivor1 區不足以存放 Eden 和 Survivor0 的存活對象時,就將存活對象直接存放到老年代。當對象在 Survivor 區躲過一次 GC 的話,其對象年齡便會加 1,默認情況下,如果對象年齡達到 15 歲,就會移動到老年代中。若是老年代也滿了就會觸發一次 Full GC,也就是新生代、老年代都進行回收。
老年代(Old Generation)
老年代(Old Generation):在新生代中經歷了 N 次垃圾回收后仍然存活的對象,就會被放到年老代中。因此,可以認為年老代中存放的都是一些生命周期較長的對象。內存比新生代也大很多(大概比例是 1:2),當老年代內存滿時觸發 Major GC 即 Full GC,Full GC 發生頻率比較低,老年代對象存活時間比較長,存活率高。一般來說,大對象會被直接分配到老年代。所謂的大對象是指需要大量連續存儲空間的對象,最常見的一種大對象就是大數組。當然分配的規則并不是百分之百固定的,這要取決于當前使用的是哪種垃圾收集器組合和 JVM 的相關參數。
垃圾回收器:
- 新生代可以適用的垃圾回收器:Serial(串行收集器)、ParNew(并行年輕代收集器)、Parallel Scavenge(并行回收器)
- 老年代可以適用的垃圾回收器:CMS(并發標記-清除收集器)、Serial Old(串行老年代收集器)、ParallelOld(并行老年代收集器)
- G1(Garbage First 收集器)和 ZGC(Z Garbage Collector)回收器適用于新生代和老年代混合回收
- 相互之間有連線的表示可以配合使用,常用組合:Serial+Serial Old, Parallel Scavenge+Parallel
Old,ParNew+CMS,G1(不需要組合其他收集器)
名詞解釋:
- 并行回收(Parallel):多條垃圾收集線程并行工作,但此時用戶線程仍然處于等待狀態
- 串行回收:單個垃圾收集線程工作
- Minor GC(Young GC):發生在年輕代的GC
- Full GC:發生在老年代的GC,full GC回收速度一般比Minor GC慢10倍左右,JVM調優也是主要針對Full GC進行調優
JVM常見三大回收算法:
Mark-Sweep(標記清除)
優點:
比較簡單
缺點:
容易碎片化(內存空間不連續)
復制算法
優點:
效率非常高,速度非常快,因為操作系統對于管理內存來說,清除一塊連續的內存效率很高,速度很快
缺點:
浪費空間
Mark-Compact(標記壓縮)
優點:
不會產生碎片
缺點:
效率低
四種引用類型:
- 強引用(Strong Reference)
它是最常見的引用類型。當一個對象被一個強引用引用時,即使內存不足時,垃圾回收器也不會回收該對象。只有當該對象的所有強引用都被解除后,垃圾回收器才會回收該對象。強引用的應用場景通常是在對象的生命周期內都需要引用該對象的情況。
- 軟引用(Soft Reference)
當一個對象如果只有軟引用,只有當系統內存不足時,垃圾回收器才會回收該對象。軟引用通常用來實現緩存或者高速緩存,當內存不足時可以釋放一些緩存的對象。
- 弱引用(Weak Reference)
在面試過程中,很多面試者經常會將弱引用和軟引用這兩者搞混,其實從名字上可以看出,弱引用是比軟引用更弱的一種引用類型,當垃圾回收器掃描到只具有弱引用的對象時,無論當前內存是否不足,都會對弱引用對象進行回收。
- 虛引用(Phantom Reference)
虛引用并不會對所指向的對象生命周期產生任何影響,也就是對象還是會按照它原來的方式被垃圾回收器回收,虛引用本質上只是一個標記作用,用來跟蹤對象被垃圾回收的活動。