java面試題 --- JVM之垃圾回收

1. 為什么要進行垃圾回收?

  • 創(chuàng)建的對象沒用時也不進行回收的話,堆內(nèi)存很快就會被消耗殆盡,所以需要把一些沒有用的對象清理掉。

2. JVM GC 分為哪幾種?

  • 分為三種,對新生代進行的垃圾回收叫 minor GC,也叫YGC;對老年代進行的垃圾回收叫 major GC;同時對新生代和老年代進行的垃圾回收叫 full GC,簡稱 FGC。

3. 如何判斷一個對象是否可以被回收?

有兩種方法判斷對象是否可回收,引用計數(shù)法和可達性分析算法。

  • 引用計數(shù)法就是維護一個計數(shù)器,有引用指向?qū)ο髸r就加一,引用失效時就減一,引用為零就可以被回收。主流的 JVM 并沒有采用這種方式,因為很難解決循環(huán)引用問題;
  • 可達性分析算法是通過一系列 GC Roots 根節(jié)點集作為起始節(jié)點,從這些節(jié)點根據(jù)引用關(guān)系向下搜索,搜索過程中經(jīng)過的路徑稱為引用鏈。如果一個對象到 GC Roots 之間沒有任何引用鏈,那么這個對象就稱為不可達,就可以被回收。主流 JVM 采用的就是這種方式。

4. 哪些對象可以當(dāng)作 GC Roots?

  • 系統(tǒng)類對象,也就是 jdk 自帶的類的對象;
  • native 方法引用的對象;
  • 活動線程正在引用的對象;
  • 正用于加鎖的鎖對象。

5. 不可達的對象會被立即回收嗎?

  • 不會,一個對象至少要兩次判斷為不可達才會進行回收,如果第一次判斷為不可達,第二次又可達,那這個對象就會復(fù)活。

6. 確定一個對象是要被回收的,那接下來如何怎么處理?

  • 會加入到回收隊列中,然后 Finalizer 線程會觸發(fā)該對象的 finalize 方法對其進行回收。Finalizer 線程并不會阻塞等待 finalize 結(jié)束,是為了不讓回收隊列阻塞。

7. 說一說垃圾回收的過程?

簡單地說就是復(fù)制、清空、互換。詳細過程是:

  • 新生代的伊甸園區(qū)對象如果滿了,就會觸發(fā) YGC,YGC 后還存活的對象,就會進入 from 區(qū),同時清空伊甸園區(qū);
  • 伊甸園區(qū)經(jīng)過一次 YGC 又滿了時,會再次觸發(fā) YGC,會對伊甸園區(qū)和 from 區(qū)都進行垃圾回收;
  • 經(jīng)過這里兩次 YGC 還存活的對象,就會復(fù)制到 to 區(qū),對象年齡加一,然后清空伊甸園區(qū)和 from 區(qū),此時 from 區(qū)和 to 區(qū)身份互換,誰空誰是 to;
  • 當(dāng)對象年齡達到閾值,默認(rèn)是15,就會進入老年代,老年代滿了就會觸發(fā) full GC,同時對新生代和老年代進行垃圾回收;
  • 觸發(fā) full GC 還沒騰出空間就會內(nèi)存溢出。

8. 有哪些垃圾回收算法?

常見的有四種,復(fù)制算法,標(biāo)記清除算法,標(biāo)記整理算法和分代回收算法。

  • 新生代的 YGC 采用的就是復(fù)制算法,垃圾回收之后還存活的對象就會被復(fù)制到另一區(qū)域。它不會產(chǎn)生內(nèi)存碎片,但是內(nèi)存利用率不高;
  • 標(biāo)記清除是先對可回收的對象進行標(biāo)記,然后再進行回收。它不會造成內(nèi)存空間的浪費,但是會產(chǎn)生內(nèi)存碎片;
  • 標(biāo)記整理就是在標(biāo)記清除的基礎(chǔ)上,對內(nèi)存碎片進行整理;
  • 新生代對象存活率低,適合用復(fù)制算法;老年代對象比較多,所以不適合用復(fù)制算法,適合用標(biāo)記整理。這種不同內(nèi)存區(qū)域根據(jù)其特點采用不同垃圾回收算法的方式叫分代回收。

9. 你知道哪些垃圾回收器?

  • serial 收集器:串行收集器,使用復(fù)制算法,新生代使用的,單線程,沒有線程交互的開銷,因此效率高,但是工作時會暫停其他所有線程;
  • serial old收集器:serial 收集器的老年代版本,使用標(biāo)記整理算法;
  • parNew 收集器:新生代收集器,使用復(fù)制算法,是 serial 收集器的多線程版本,性能更好;
  • parNew old 收集器:parNew 收集器的老年代版本,使用標(biāo)記整理算法;
  • parallel scavenge 收集器:使用復(fù)制算法,jdk8 新生代使用的默認(rèn)收集器,更關(guān)注吞吐量,能更高效地利用 CPU;
  • CMS 收集器:老年代并發(fā)收集器,使用標(biāo)記清除算法,可以和用戶線程并發(fā)執(zhí)行。優(yōu)點是并發(fā)運行,低停頓,缺點是會產(chǎn)生內(nèi)存碎片;
  • G1 收集器:使用標(biāo)記整理算法的堆收集器,也就是新生代和老年代都可以使用這種收集器。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容