五分鐘學Java:如何學習Java面試必考的JVM虛擬機

副本_未命名.jpg

原創聲明

本文首發於微信公衆號【程序員黃小斜】java

本文做者:黃小斜git

轉載請務必在文章開頭註明出處和做者。程序員

本文思惟導圖

JVM虛擬機

爲何要學習JVM虛擬機

最近的你有沒有參加Java面試呢?你有沒有發現,Java面試中老是愛考一類問題,那就是JVM虛擬機,爲何面試官這麼愛考察JVM的問題呢,這是由於,全部的Java程序本質上都是運行在JVM之上的,沒有JVM虛擬機,也就沒有Java語言的執行環境,只有掌握了JVM虛擬機的相關知識,你才能說你懂Java,不然就像一個只會玩手機的人說本身壓根不懂安卓操做系統同樣。github

根據百度百科的介紹,JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用於計算設備的規範,它是一個虛構出來的計算機,是經過在實際的計算機上仿真模擬各類計算機功能來實現的。引入Java語言虛擬機後,Java語言在不一樣平臺上運行時不須要從新編譯。Java語言使用Java虛擬機屏蔽了與具體平臺相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就能夠在多種平臺上不加修改地運行。面試

就是由於有JVM的存在,Java纔可以擁有跨平臺運行的能力,一次編譯,處處運行,反觀C++這類語言,須要處處編譯才能運行,由於它自己是和操做系統強關聯的一門語言,也沒有虛擬機的概念。算法

固然,由於有了JVM虛擬機的存在,Java語言的複雜度也大大下降,其所付出的代價就是運行速度有所降低,離開JVM虛擬機談Java是沒有意義的,學好JVM是學好一切Java技術的前提。編程

如何學習JVM虛擬機

JVM虛擬機就在咱們的身邊

第一次據說JVM虛擬機這個東西,仍是在一道面試題中,那時候我徹底不知道這是個啥玩意啊,後來我買了一本號稱JVM聖經的書《深刻理解JVM虛擬機》纔有幸知道,原來JVM虛擬機就運行在咱們的電腦中。服務器

做爲一個Java開發者,入門三件套可能就是IDE、JDK和JRE了,其實JDK就包含了JRE,而JRE(Java運行環境)也就包含了JVM虛擬機。當咱們使用javac或者使用ide進行Java程序的編譯或者執行時,其實就是把java代碼變異成class字節碼,而後扔到JVM執行。微信

此時咱們的任務管理器裏會有一個進程叫作java,這個進程就能夠理解爲JVM程序,而這個進程裏還有不少子線程,分別負責執行代碼,垃圾回收等等。多線程

不少時候咱們壓根不知道JVM虛擬機是個啥,天然也不能很好地學習它,一旦咱們瞭解了它的本質,後面的東西學習起來也就不會那麼痛苦了。

初探JVM面試題

有不少程序員第一次據說JVM多是在面試的時候,關於JVM的面試題其實也很多,這裏舉例一些比較熱門的面試題型,好比「JVM的堆和棧有什麼區別」、「JVM的垃圾回收算法有哪些」、「JVM的內存模型是什麼樣的」等等,這類題目算是比較基礎的了。

這類題目,通常經過刷刷面經,也可以回答上來一些,畢竟面試官懂得也不必定比你多,因此一些面試官可能也不會深挖下去。不過若是是一些對技術考察得比較有深度的公司就不必定了,不少以Java技術棧爲主的公司,特別是電商類公司,對於JVM的考察仍是比較有深度的,除了阿里和美團,還有京東、惟品會、有贊、拼多多等公司。

因此,咱們不妨也來看看進階版的JVM面試題長什麼樣。首先,進階版的題目主要考察深度,像是JVM的內存模型,必定會讓你講清楚每一個區域是作什麼的,而且會讓實際的場景來問你,好比字符串變量放在哪一個區域,類的元數據放在哪一個區域,局部變量和全局變量又分別放在哪一個區域。若是你對內存模型只是只知其一;不知其二,一會兒就會被面試官給識破了。

進階版的JVM面試還喜歡考察細節,好比JVM的垃圾回收算法,中止複製,標記清除,須要你把過程講清楚,各自的優劣講清楚。若是這類問題對你也夠不成威脅,那不妨再看看JVM垃圾回收的其餘題型,「年輕代的GC是如何進行的,請講解詳細過程」不少面試者可能會簡單地講一下年輕代的回收方法。

你可能會簡單地回答:「使用中止複製的方法來完成的」實際上,其實,這裏面能講的細節有不少,首先,年輕代分爲eden區和survivor區,survivor區還分爲from和to區,eden區存活的對象會被放到from區,而在下一次young gc後,from區和to區會交換位置,對象也會跟着搬移,從而該對象的年齡加一,當對象的年齡超過閾值時,對象就會進入老年代。

看似簡單的問題竟然能夠答出這麼多門道,這也是我在經歷不少次面試以後才總結出來的經驗。

JVM聖經《深刻理解JVM虛擬機》

Java書籍千千萬,可是真正可以講清楚JVM虛擬機的書可能也只有這一本了。網上的大部分關於JVM的博客基本都是借鑑或者是參考本書的內容。

那麼這本書到底講了哪些些JVM的內容了,不妨和我一塊兒來拆解一下。

第一部分,這本書講了Java這門語言的歷史,以及它爲何要運行在JVM上,這一點很重要,要否則開發者也會很奇怪,爲何好好的編程語言要運行在虛擬機上呢。

第二部分,本書開始介紹JVM的核心概念,那就是內存模型,JVM是如何管理計算機的內存的,又是如何劃分這些區域的,畢竟Java裏的類型和變量那麼多,確實很差管理。

第三部分,是這本書比較難的一部分,它開始介紹Java代碼的運行原理,那就是要先把java代碼編譯成字節碼,而後才能在JVM上執行,而Java代碼又是由一個個類組成的,因此文章要介紹JVM虛擬機是如何加載這些類的,這裏面有不少新穎的概念,值得咱們去探索。

第四部分,程序編譯和代碼優化,這部份內容其實比較冷門,但其實是很複雜的,這裏面提到了不少JVM對於程序執行的優化,包括編譯期的優化和運行期的優化,優化的目的是讓Java程序更高效地運行,瞭解了這部份內容以後,你必定會對JVM虛擬機的設計產生崇敬之情。

第五部分,主要介紹了JVM對Java多線程的支持,Java中的多線程天然也是基於JVM進行設計和實現的,其中就涉及到了咱們經常使用的鎖,這裏主要介紹的是synchronized,它的本質是互斥鎖,可是隨着JVM對於重量級鎖synchronized的優化,它也逐漸開始支持輕量級鎖和偏向鎖。

能夠說,本書全程都是精華,基本上都是重點,考試會考,固然其中也有一些內容比較冷門,不怎麼受面試官待見。可是這本書基本上把JVM裏咱們須要掌握的知識都講清楚了,對於JVM的理論學習,這一本書足矣。

JVM調優實戰

講完了理論,終於到了實戰的部分。
JVM知識總體看來是一個偏理論的知識模塊,彷佛能實踐的東西很少,但實際上,JVM方面能實踐的東西可很多,好比JVM調優,JVM的GC分析以及內存分析,都是面試官很喜歡考察的實踐能力。
接下來的部分,咱們就來說講JVM實戰的內容。

在一些高級Java面試中,關於JVM的問題可能就會涉及到JVM調優和實踐上了,好比你有沒有遇到過OOM或者內存泄漏,你是怎麼發現它們的,又或者,GC過於頻繁,咱們應該如何進行排查。
總之,這類問題都是立足於實踐,考察的就是候選人的實踐經驗,這對於平時一直CRUD,連服務器都沒怎麼碰過的朋友來講,確實是一個不小的挑戰。

那咋辦呢,其實辦法也不是沒有,畢竟我就是一個沒有JVM實踐經驗的小白,以前我對於這方面的複習主要是經過幾個方法。

找一些比較知名的JVM調優工具,試用一下,好比Jprofile,還有JDK自帶的jmap jstack等等。把這些工具都拿來用於本身的程序測試,寫幾個oom或者是內存泄漏的程序,看看工具裏都會出現什麼狀況,這就是其中一種不錯的學習方法。

可是有人會說,不少面試題都是要有高並或者高負載的場景,平時本身的代碼根本不會出現這種問題,那怎麼辦呢,其實也有辦法,網上對於這類調優面試題其實也有不少分享,針對某一種場景如何調優,操做步驟應該是怎樣的,其實都能從別人的文章中找到一些答案,這樣,即便你平時工做沒有這類實踐,也能夠經過學習JVM調優實戰的文章來進行復習,其實道理都是同樣的。

推薦資源

書籍

《深刻理解JVM虛擬機》

視頻

我整理了一些JVM方面的學習視頻,分享給你們,其實這方面的視頻資源並很少,畢竟大多數視頻仍是講項目或者基礎爲主,能把JVM虛擬機講透講好的人確實很少。

博客

Java技術倉庫《Java程序員複習指南》
https://github.com/h2pl/Java-Tutorial
整合全網優質Java學習內容,幫助你從基礎到進階系統化複習Java

面試指南

全網最熱的Java面試指南,共200多頁,很是實用,無論是用於複習仍是準備面試都是不錯的。

總結

關於如何學習JVM虛擬機,而且搞定相關面試題,咱們今天就講到這裏了,若是還有什麼疑問也能夠到我公衆號【程序員黃小斜】裏找我探討,後續會有更多的文章推出,包括如何系統性地學習JavaWeb,敬請期待。

對了,你想問我文章裏提到的書籍和視頻去哪找?我已經給你準備好了

文中提到的資源均可以避免費領取,在個人公衆號【程序員黃小斜】回覆「Java併發編程」便可免費領取對應的資源。

寫在最後

若是以爲本文對你有幫助的話,請你也不要吝嗇你的「好看」哈,轉發朋友圈就是對我最大的支持啦,大家的支持是對我最大的鼓勵。

對本系列文章有什麼建議和意見,也歡迎留言告訴我,期待你的回饋。

相關文章
相關標籤/搜索