點個贊,看一看,好習慣!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收錄,這是我花了3個月總結的一線大廠Java面試總結,本人已拿騰訊等大廠offer。
先瞎比比一下,上一篇文章已通過去2個多月了,你大概會問我這段時間幹什麼去了,怎麼沒有更新文章,那我告訴你,固然是面試去了,通過了一個多月的面試,身經百戰,已經拿了幾個offer,如今是時候把前段時間的知識儲備給你們分享出來了,順便也換種形式來給你們講講相關的知識。java
接下來的每篇文章都會是先給出幾個問題,而後再知識點,而後再回答問題這樣的形式。git
這一段面試的時間面了不少的互聯網公司的大廠,也很幸運拿了幾個offer,如今也仍是面試的過程當中,能夠說,這麼多的面試,Java虛擬機是一個必問的知識點,而垃圾回收器更是重中之重,若是面試官拋出一個垃圾回收器的問題,你一臉懵逼,那估計這個面試是涼了。github
好比,面試官一上來就狠狠的問了這幾個問題。面試
再來個深一點的問題?算法
沒有看過這些知識點是否是一臉懵逼。微信
好了,接下來我來說講這些垃圾回收器都是什麼神仙,面試官爲何喜歡死磕這個呢?數據結構
先上一張圖,這張圖是Java虛擬機的jdk1.7及之前版本的全部垃圾回收器,也能夠說是比較成熟的垃圾回收器,除了這些垃圾回收器,面試的時候最多也就再懟懟G1和ZGC了。多線程
上面的表示是年輕代的垃圾回收器:Serial、ParNew、Parallel Scavenge,下面表示是老年代的垃圾回收器:CMS、Parallel Old、Serial Old,以及不分老年代和年輕代的G1。之間的相互的連線表示能夠相互配合使用。併發
說完是否是一篇明朗,其實也就是那麼回事。數據結構和算法
Serial(串行)收集器是最基本、發展歷史最悠久的收集器,它是採用複製算法的新生代收集器,曾經(JDK 1.3.1以前)是虛擬機新生代收集的惟一選擇。它是一個單線程收集器,只會使用一個CPU或一條收集線程去完成垃圾收集工做,更重要的是它在進行垃圾收集時,必須暫停其餘全部的工做線程,直至Serial收集器收集結束爲止(「Stop The World」)。
其實對於這個垃圾回收器,你只要記住是一個單線程、採用複製算法的,會進行「Stop The World」 便可,由於面試官通常不問這個,爲何,由於太簡單了,沒什麼可問的唄。
好了,再放一張圖好吧,說明一下Serial的回收過程,完事。
說明:這張圖的意思就是單線程,新生代使用複製算法標記、老年代使用標記整理算法標記,就是這麼簡單。
ParNew收集器就是Serial收集器的多線程版本,它也是一個新生代收集器。除了使用多線程進行垃圾收集外,其他行爲包括Serial收集器可用的全部控制參數、收集算法(複製算法)、Stop The World、對象分配規則、回收策略等與Serial收集器徹底相同。
須要注意一點是:除了Serial收集器外,目前只有它能和CMS收集器(Concurrent Mark Sweep)配合工做。
最後再放一張回收過程圖;
* 是否是很簡單,我在這裏講這些知識點並非爲了深刻去了解這些原理,基本的知道對於工做已經夠了,其實,主要仍是應付面試官,哈哈。
Parallel Scavenge收集器也是一個並行的多線程新生代收集器,它也使用複製算法。
Parallel Scavenge收集器的特色是它的關注點與其餘收集器不一樣,CMS等收集器的關注點是儘量縮短垃圾收集時用戶線程的停頓時間。
這裏須要注意的惟一的區別是:Parallel Scavenge收集器的目標是達到一個可控制的吞吐量(Throughput)。
咱們知道,停頓時間越短就越適合須要與用戶交互的程序,良好的響應速度能提高用戶體驗。而高吞吐量則能夠高效率地利用CPU時間,儘快完成程序的運算任務,主要適合在後臺運算而不須要太多交互的任務。
Serial Old 是Serial收集器的老年代版本,它一樣是一個單線程收集器,使用「標記-整理」(Mark-Compact)算法。
在這裏就能夠出一個面試題了。
同一個爸爸,兒子長的天差地別,固然也有啊,哈哈。
其實,看了我前面的文章你可能就知道了,由於在新生代絕大多數的內存都是會被回收的,因此留下來的須要回收的垃圾就不多了,因此複製算法更合適,你能夠發現,基本的老年代的都是使用標記整理算法,固然,CMS是個雜種哈。
它的工做流程與Serial收集器相同,下圖是Serial/Serial Old配合使用的工做流程圖:
Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多線程和「標記-整理」算法,是否是前面說的,老年代出了雜種CMS不是「標記-整理」算法,其餘都是。
另外,有了Parallel Old垃圾回收器後,就出現了以「吞吐量優先」著稱的「男女友」收集器了,這就是:Parallel Old和Parallel Scavenge收集器的組合。
Parallel Old收集器的工做流程與Parallel Scavenge相同,這裏給出Parallel Scavenge/Parallel Old收集器配合使用的流程圖:
你是否是覺得我還要講CMS和G1,我任性,這幾個面試重點仍是得死磕它,下回分解哈。
這裏把上面的這些垃圾回收器作個總結,看完這個,面試給面試官講的時候思路就很是清晰了。
收集器 | 串行、並行or併發 | 新生代/老年代 | 算法 | 目標 | 適用場景 |
---|---|---|---|---|---|
Serial | 串行 | 新生代 | 複製算法 | 響應速度優先 | 單CPU環境下的Client模式 |
Serial Old | 串行 | 老年代 | 標記-整理 | 響應速度優先 | 單CPU環境下的Client模式、CMS的後備預案 |
ParNew | 並行 | 新生代 | 複製算法 | 響應速度優先 | 多CPU環境時在Server模式下與CMS配合 |
Parallel Scavenge | 並行 | 新生代 | 複製算法 | 吞吐量優先 | 在後臺運算而不須要太多交互的任務 |
Parallel Old | 並行 | 老年代 | 標記-整理 | 吞吐量優先 | 在後臺運算而不須要太多交互的任務 |
好了,這回就到這裏了,開頭的幾個問題,你會了嗎?
另外,我花了3個月時間把Java學習和麪試的總結整理成了一本電子書!目錄以下
如今免費分享你們,在個人公衆號好好學java回覆Java面試便可獲取。
一、老鐵們,關注個人原創微信公衆號「好好學java」,專一於Java、數據結構和算法、微服務、中間件等技術分享,保證你看完有所收穫。
二、給俺點個讚唄,可讓更多的人看到這篇文章,順便激勵下我繼續寫做,嘻嘻。
點贊是對我最大的鼓勵↓↓↓↓↓↓