文章目錄
- 前言
- 一、部分大廠對于 JVM GC 的面試題
- 1.1、百度
- 1.2、順豐
- 1.3、京東
- 1.4、淘寶
- 1.5、阿里、蘑菇街
- 二、Garbage Collectors(GC)作何使用
- 三、GC 的十種類型
- 四、JVM 的版本參數信息
- 4.1、查看 Java 啟動時所有默認的命令行參數
- 4.2、查看 Java 啟動時 GC 的參數信息
- 五、GC 的分代模型與分區模型
- 5.1、分代模型
- 5.1.1、新生代
- 5.1.2、老年代
- 總結
前言
現在除了一些有工作和開發經驗的大神,基本很少有人在簡歷上敢寫“精通 JVM 調優,有過 JVM 調優經驗”,因為應聘者如果寫這句話就意味著你的面試將會是很“難過”的,面試官會變著法的問你如何進行 JVM 系列調優,如果你的基礎比較薄弱或者是僅僅背面試題速成,那么你很可能在面試中露餡。JVM 作為 Java 的核心,面試后端開發工程師或者架構師這都是必備的技能。既然 JVM 如此重要,那我就在本系列中完整的過一遍,讓你敢于在簡歷上寫“精通 JVM 調優,有過 JVM 調優經驗”,薪資漲 5k!在聊 JVM 調優和 GC 之前,我們先看看當下就業環境中面試對于 JVM 和 GC 的一些相關面試題,看看企業開發崗需要什么樣的人才。
一、部分大廠對于 JVM GC 的面試題
說明:以下數據來源于 2019~2020 年一些大廠的面試題。
1.1、百度
- CMS 和 G1 的異同。
- G1 什么時候引發 FullGC?
- 說一個最熟悉的垃圾回收算法。
- 吞吐量優先和響應時間優先的回收器有哪些?
1.2、順豐
- 怎么判斷內存泄漏?
- 講一下 CMS 的流程。
1.3、京東
- 為什么壓縮指針超過 32G 失效?
1.4、淘寶
- 什么是內存泄漏?GC 調優有經驗嗎?一般出現 GC 問題你怎么解決?
1.5、阿里、蘑菇街
- ThreadLocal 有沒有內存泄漏問題?
- G1 兩個 Region 不是連續的,而且之間還有可達的引用,我現在要回收一個,另一個怎么處理?
- 講一下 JVM 堆內存管理(對象分配過程)。
- 聽說過 CMS 的并發預處理和并發可中斷預處理嗎?
- 到底多大的對象會被直接扔到老年代?
看了面試題,作何感想?可能有人覺得簡單,有人一知半解,聽過但是不會。不要急!我們慢慢來。
二、Garbage Collectors(GC)作何使用
首先我們都知道,在 Java 當中,我們在創建一個對象之后,就可以無需再去管它,該對象不被使用變成一個垃圾之后,誰去進行處理?Garbage Collectors(垃圾回收器)。
備注:后續文章內容 Garbage Collectors 皆用 GC 代替。
三、GC 的十種類型
JVM 作為 Java 的樞紐,管理著全部的內存,而對于內存的分配和回收就是由垃圾回收器來控制。
從 JVM 的誕生到現在 2021 年,一共產生過十種類型的垃圾回收器,如下圖所示:
這里呢大家可以對這十種垃圾回收器僅作了解,我們將會在后續的章節中一一為大家介紹。
四、JVM 的版本參數信息
現在企業開發絕大多數使用的版本為 1.8。我本地的開發版本也是 1.8,我們就通過該版本來進行演示。
如果我們直接將程序部署到 JVM 上,沒有做過任何調優動作,1.8 版本的默認 GC 為 Parallel。
可能有人會有疑問:如何查看開發環境下 JVM 默認的 GC 版本信息呢?別急,往下看。
首先我們來認識以下幾個命令,我們打開 CMD 命令界面。
4.1、查看 Java 啟動時所有默認的命令行參數
輸入以下 Shell 命令:
java -XX:+PrintCommandLineFlags
這是我們就可以看到打印出的 Java 啟動時所有默認的命令行參數,如下圖所示:
4.2、查看 Java 啟動時 GC 的參數信息
如果只需要查看本地環境下的 GC 參數信息,我們輸入如下 Shell 命令即可:
java -XX:+PrintCommandLineFlags -version
我們可以從控制臺的返回信息得知,1.8.0_251-b08 版本所對應的默認 GC 為 Parallel,如下圖所示:
五、GC 的分代模型與分區模型
上面我們已經說到,內存的分配和回收就是由垃圾回收器來控制。
我們將 GC 的使用分為兩大類,分別是:分代模型和分區模型。
- 分代模型:兩個垃圾回收器混合控制系統中的垃圾回收。
- 分區模型:不再分代,一個垃圾回收器就足夠。
在本節中我們將著重對分代模型進行介紹。
5.1、分代模型
分代模型將內存分為兩個大的部分,新生代和老年代。
如下圖所示,左半部分為新生代,右半部分為老年代:
新生代和老年代所對應的回收算法應用:
- 新生代大量死去,少量存活,采用復制算法。
- 老年代存活率高,回收較少,采用MC或MS。
5.1.1、新生代
剛剛誕生的的對象為“新生”,存放在新生代區域里面。隨著程序的運行,大部分“新生對象”被垃圾回收。
5.1.2、老年代
垃圾回收器回收了多次沒有回收掉的對象被稱為“老年”,就被存放在老年代中。
在默認情況下 JDK 1.8 沒有調參數、調優用的就是 GC 的分代模型。
總結
在本文中我們通過面試題知道了大廠開發對于 JVM 的要求,暫時了解在 JVM 中存在的十種 GC,學會如何查看本地開發環境默認的 GC,掌握了 GC 的兩種使用方式,分代模型與分區模型,明白什么樣的對象屬于什么代,存放在內存中的什么位置。同時,在新生代和老年代中又會誕生各種各樣的垃圾回收算法,我們將在下一小節講解。我是白鹿,一個不懈奮斗的程序猿。望本文能對你有所裨益,歡迎大家的一鍵三連!若有其他問題、建議或者補充可以留言在文章下方,感謝大家的支持!