面試的時候按照這個套路回答 Java GC 的相關問題必定能過

Java GC面試

目標

遇到一個問題或者一個知識點,咱們要理解和明白是要解決什麼問題的。說到 Java GC 那這個 GC 的目的是什麼呢?很顯然是回收內存,由於內存是有限的,隨着程序中建立的對象愈來愈多,若是進行回收就會致使內存愈來愈大,最後程序就會出現異常。既然目的是爲了回收內存,那麼新的問題來了,哪些對象能夠被回收呢?何時進行回收呢?怎麼回收呢?算法

哪些對象能夠被回收

簡單來講就是無用的對象能夠被回收,那麼換句話說,若是定義一個對象是無用的呢?這裏主要有兩種方法,一個叫引用計數法,一個叫可達性分析法。微信

引用計數

引用計數說的是若是一個對象被別的對象進行了一次引用,那麼該對象會有一個引用計數器,這個計數器就會加一;若是被釋放一下,引用計數器就會減一。當引用計數器的計數爲 0 的時候就表示這個對象是無用的,此時就能夠對這樣對象進行回收了。表面上看好像挺合理的,實現起來也很方便,可是仔細一想就會發現有問題。既循環引用的問題,好比對象 A 引用了對象 B,可是對象 B 當中也引用了對象 A,那麼這個時候對象 A 和對象 B 的引用計數器的計數都不會是 0,可是這兩個對象都沒有被其餘對象引用,理論上來講這兩個對象都是能夠被回收的。多線程

從上面看到,這種方案是有問題的會致使內存泄露。隨之而來的就出現了另外一種方案,可就是可達性分析。分佈式

可達性分析

可達性分析說的是從 GCRoots 的點做爲起點,向下搜索,當找不到任何引用鏈的時候表示該對象爲垃圾對象。那麼哪些對象能夠被認爲是 Roots 節點呢?有 Java 棧中的對象,方法區的靜態屬性和常量以及本地方法棧中的對象。從這幾種對象依次向下搜索,若是沒有能達到 Roots 節點的對象就是垃圾對象,就說明能夠被回收。微服務

以下圖全部,對象 A,B,C都能找到與 Roots 節點的聯繫,可是對象 D,E,F 三個並不能找到與 Roots 節點的聯繫,也就是不可達,因此 DEF 這三個對象就是垃圾對象。線程

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

 

何時回收

上面的兩種方案解決了哪些對象能被回收,那麼下個問題,就是何時進行垃圾回收呢?在排除人爲調用的時候,垃圾回收都是發生在爲新生對象進行內存分配的時候,這個時候若是內存空間不足就會觸發 GC 進行垃圾回收。3d

怎麼回收

上面咱們知道了哪些對象能夠被回收,也知道咱們應該何時進行回收,那下面要解決的就是如何進行垃圾回收了。垃圾回收根據實現的方式不一樣有多種不一樣的算法實現。好比有標記清除算法,複製算法,標記整理算法,分代回收算法,下面簡單介紹一下,想深刻了解的能夠自行去研究一下。對象

標記清除算法

標記清除算法很好理解,主要就是執行兩個動做,一個是標記,另外一個是對進行標記的對象內存進行清除回收。這個算法有個問題就是會出現內存碎片化嚴重。以下圖所示:blog

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

 

從上圖中能夠看到,在進行內存回收後出現了嚴重的內存碎片化,這就致使在分配某些大對象的時候仍然會出現內存不夠的狀況,可是整體內存確是夠的。

複製算法

複製算法的實現方式比較簡潔明瞭,就是霸道的把內存分紅兩部分,在平時使用的時候只用其中的固定一份,在當須要進行 GC 的時候,把存活的對象複製到另外一部分中,而後將已經使用的內存所有清理掉。以下圖:

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

 

從上圖能夠看到解決了標記清除的內存碎片化問題,可是很明顯複製算法有另外一個問題,那就是內存的使用率大大降低,能使用的內存只有原來的一半了。

標記整理算法

既然標記清除和複製算法各有優缺點,那天然的咱們就想到是否能夠把這兩種算法結合起來,因而就出現了標記整理算法。標記階段是標記清除算法同樣,先標記出須要回收的部分,不過清除階段不是直接清除,而是把存活的對象往內存的一端進行移動,而後清除剩下的部分。以下圖:

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

 

標記整理的算法雖然能夠解決上面兩個算法的一些問題,可是仍是須要先進行標記,而後進行移動,整個效率仍是偏低的。

分代回收算法

分代回收算法是目前使用較多的一種算法,這個不是一個新的算法,只是將內存進行的劃分,不一樣區域的內存使用不一樣的算法。根據對象的存活時間將內存的劃分爲新生代和老年代,其中新生代包含 Eden 區和 S0,S1。在新生代中使用是複製算法,在進行對象內存分配的時候只會使用 Eden 和 S0 區,當發生 GC 的時候,會將存活的對象複製到 S1 區,而後循環往復進行復制。當某個對象在進行了 15 次GC 後依舊存活,那這個對象就會進入老年代。老年代由於每次回收的對象都會比較少,所以使用的是標記整理算法。

垃圾回收器

講完了垃圾回收算法,咱們再看下垃圾回收器,每一種垃圾回收器都是不一樣時代的不一樣產物,都有其獨特性。

  • Serial 垃圾收集器(單線程、複製算法)
  • ParNew垃圾收集器(Serial+多線程)
  • Parallel Scavenge 收集器(多線程複製算法、高效)
  • SerialOld收集器(單線程標記整理算法)
  • ParallelOld收集器(多線程標記整理算法)
  • CMS收集器(多線程標記清除算法)
  • G1收集器

各個垃圾收集器的配合使用狀況能夠參考下圖,我的以爲對這麼多的收集器沒有必要所有精通,能夠注重關注一下 CMS 和 G1 就能夠了。感興趣的小夥伴能夠本身的研究一下。

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

 

最後小編整理了一套技術資料不只能精準消除技術盲點、累計面試經驗,更能夠攻克MQ、JVM、Spring、分佈式、微服務等技術難題。

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

 

海量電子書,珍藏版

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

 

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

 

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

 

面試的時候按照這個套路回答 Java GC 的相關問題必定能過

領取步驟

1.加微信獲取

相關文章
相關標籤/搜索