95%的技術(shù)面試必考的JVM知識點都在這,另附加分思路!-創(chuàng)新互聯(lián)

概述:知識點匯總

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比余杭網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式余杭網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋余杭地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。

jvm的知識點匯總共6個大方向:內(nèi)存模型、類加載機制、GC垃圾回收是比較重點的內(nèi)容。性能調(diào)優(yōu)部分偏重實際應(yīng)用,重點突出實踐能力。編譯器優(yōu)化和執(zhí)行模式部分偏重理論基礎(chǔ),主要掌握知識點。

各個部分的內(nèi)容如下:

1>內(nèi)存模型部分:程序計數(shù)器、方法區(qū)、堆、棧、本地方法棧的作用,保存哪些數(shù)據(jù);

2>類加載部分:雙親委派的加載機制以及常用類加載器分別加載哪種類型的類;

3>GC部分分代回收的思想和依據(jù),以及不同垃圾回收算法實現(xiàn)的思路、適合的場景;

4>性能調(diào)優(yōu)部分:常用的jvm優(yōu)化參數(shù)的作用,參數(shù)調(diào)優(yōu)的依據(jù),要了解常用的jvm分析工具能分析哪類問題,以及使用方法;

5>執(zhí)行模式部分:解釋、編譯、混合模式的優(yōu)缺點,了解java7提供的分層編譯技術(shù)。需要知道JIT即時編譯技術(shù)和OSR也就是棧上替換,知道C1、C2編譯器針對的場景,其中C2針對server模式,優(yōu)化更激進。在新技術(shù)方面可以了解一下java10提供的由java實現(xiàn)的graal編譯器。

6>編譯優(yōu)化部分:前端編譯器javac的編譯過程、AST抽象語法樹、編譯期優(yōu)化和運行期優(yōu)化。編譯優(yōu)化的常用技術(shù),包括公共子表達(dá)式的消除、方法內(nèi)聯(lián)、逃逸分析、棧上分配、同步消除等。明白了這些才能寫出對編譯器友好的代碼。

jvm的內(nèi)容相對來說比較集中,但是對知識深度的掌握要求較高,建議面試前重點加強。

一、jvm內(nèi)存相關(guān)考點

1.詳解-jvm內(nèi)存模型

jvm內(nèi)存模型主要指運行時的數(shù)據(jù)區(qū),包括5個部分。

棧也叫方法棧,是線程私有的,線程在執(zhí)行每個方法時都會同時創(chuàng)建一個棧幀,用來存儲局部變量表、操作棧、動態(tài)鏈接、方法出口等信息。調(diào)用方法時執(zhí)行入棧,方法返回時執(zhí)行出棧。

本地方法棧與棧類似,也是用來保存線程執(zhí)行方法時的信息,不同的是,執(zhí)行java方法使用棧,而執(zhí)行native方法使用本地方法棧。

程序計數(shù)器保存著當(dāng)前線程所執(zhí)行的字節(jié)碼位置,每個線程工作時都有一個獨立的計數(shù)器。程序計數(shù)器為執(zhí)行java方法服務(wù),執(zhí)行native方法時,程序計數(shù)器為空。

棧、本地方法棧、程序計數(shù)器這三個部分都是線程獨占的。

堆是jvm管理的內(nèi)存中大的一塊,堆被所有線程共享,目的是為了存放對象實例,幾乎所有的對象實例都在這里分配。當(dāng)堆內(nèi)存沒有可用的空間時,會拋出OOM異常。根據(jù)對象存活的周期不同,jvm把堆內(nèi)存進行分代管理,由垃圾回收器來進行對象的回收管理。

方法區(qū)也是各個線程共享的內(nèi)存區(qū)域,又叫非堆區(qū)。用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù),

jdk1.7中的永久代和1.8中的metaspace都是方法區(qū)的一種實現(xiàn)。

面試回答此知識點相關(guān)問題時,要答出兩個要點:一個是各部分的功能,另一個是哪些線程共享,哪些獨占。

2.詳解-jmm內(nèi)存可見性

jmm是java內(nèi)存模型,與剛才講到的jvm內(nèi)存模型是兩回事,jmm的主要目標(biāo)是定義程序中變量的訪問規(guī)則,如圖所示,所有的共享變量都存儲在主內(nèi)存中共享。每個線程有自己的工作內(nèi)存,工作內(nèi)存中保存的是主內(nèi)存中變量的副本,線程對變量的讀寫等操作必須在自己 的工作內(nèi)存中進行,而不能直接讀寫主內(nèi)存中的變量。

在多線程進行數(shù)據(jù)交互時,例如線程a給一個共享變量賦值后,由線程b來讀取這個值,a修改完變量是修改在自己的工作區(qū)內(nèi)存中,b是不可見的,只有從a的工作區(qū)寫回到主內(nèi)存,b再從主內(nèi)存讀取到自己的工作區(qū)才能進行進一步的操作。由于指令重排序的存在,這個寫-讀的順序有可能被打亂。

因此jmm需要提供原子性、可見性、有序性的保證。

3、詳解-jmm保證

主要介紹下jmm如何保證原子性、可見性,有序性。

jmm保證對除long和double外的基礎(chǔ)數(shù)據(jù)類型的讀寫操作是原子性的。另外關(guān)鍵字Synchronized也可以提供原子性保證。Synchronized的原子性是通過java的兩個高級的字節(jié)碼指令monitorenter和monitorexit來保證的。

jmm可見性的保證,一個是通過Synchronized,另外一個就是volatile。volatile強制變量的賦值會同步刷新回主內(nèi)存,強制變量的讀取會從主內(nèi)存重新加載,保證不同的線程總是能夠看到該變量的最新值。

jmm對有序性的保證,主要通過volatile和一系列happens-before原則。volatile的另一個作用就是阻止指令重排序,這樣就可以保證變量讀寫的有序性。

happens-before原則包括一系列規(guī)則,如

  • 程序順序原則,即一個線程內(nèi)必須保證語義串行性;

  • 鎖規(guī)則,即對同一個鎖的解鎖一定發(fā)生在再次加鎖之前;

  • 此外還包括happens-before原則的傳遞性、線程啟動、中斷、終止規(guī)則等。

二、類加載機制相關(guān)考點

1.詳解類加載機制

類的加載指的是將編譯好的class類文件中的字節(jié)碼讀入到內(nèi)存中,將其放在方法區(qū)內(nèi)并創(chuàng)建對應(yīng)的Class對象。

類的加載分為加載、鏈接、初始化,其中鏈接又包括驗證、準(zhǔn)備、解析三步??吹綀D中上半部分深綠色,我們逐個分析:

  • 加載是文件到內(nèi)存的過程。通過類的完全限定名查找此類字節(jié)碼文件,并利用字節(jié)碼文件創(chuàng)建一個Class對象

  • 驗證是對類文件內(nèi)容驗證。目的在于確保Class文件符合當(dāng)前虛擬機要求,不會危害虛擬機自身安全。主要包括四種:文件格式驗證,元數(shù)據(jù)驗證,字節(jié)碼驗證,符號引用驗證。

  • 準(zhǔn)備階段是進行內(nèi)存分配。為類變量也就是類中由static修飾的變量分配內(nèi)存,并且設(shè)置初始值,這里要注意,初始值是0或者null,而不是代碼中設(shè)置的具體值,代碼中設(shè)置的值是在初始化階段完成的。另外這里也不包含用final修飾的靜態(tài)變量,因為final在編譯的時候就會分配了。

  • 解析主要是解析字段、接口、方法。主要是將常量池中的符號引用替換為直接引用的過程。直接引用就是直接指向目標(biāo)的指針、相對偏移量等。

  • 最后是初始化:主要完成靜態(tài)塊執(zhí)行與靜態(tài)變量的賦值。這是類加載最后階段,若被加載類的父類沒有初始化,則先對父類進行初始化。

只有對類主動使用時,才會進行初始化,初始化的觸發(fā)條件包括創(chuàng)建類的實例的時候、訪問類的靜態(tài)方法或者靜態(tài)變量的時候、Class.forName()反射類的時候、或者某個子類被初始化的時候。

類的生命周期,就是從類的加載到類實例的創(chuàng)建與使用,再到類對象不再被使用時可以被GC卸載回收。這里要注意一點,由java虛擬機自帶的三種類加載器加載的類在虛擬機的整個生命周期中是不會被卸載的,只有用戶自定義的類加載器所加載的類才可以被卸載。

2.詳解類加載器 ??

java自帶的三種類加載器分別是:bootstrap啟動類加載器、擴展類加載器和應(yīng)用加載器也叫系統(tǒng)加載器。圖右邊的桔×××文字表示各類加載器對應(yīng)的加載目錄。啟動類加載器加載java home中l(wèi)ib目錄下的類,擴展加載器負(fù)責(zé)加載ext目錄下的類,應(yīng)用加載器加載classpath指定目錄下的類。

除此之外,可以自定義類加載器。

java的類加載使用雙親委派模式,即一個類加載器在加載類時,先把這個請求委托給自己的父類加載器去執(zhí)行,如果父類加載器還存在父類加載器,就繼續(xù)向上委托,直到頂層的啟動類加載器,如圖中藍(lán)色向上的箭頭。如果父類加載器能夠完成類加載,就成功返回,如果父類加載器無法完成加載,那么子加載器才會嘗試自己去加載。

這種雙親委派模式的好處,一個可以避免類的重復(fù)加載,另外也避免了java的核心API被篡改。

三、其他知識梳理

1.詳解分代回收 ???

前面提到過,java的堆內(nèi)存被分代管理,分代管理主要是為了方便垃圾回收,這樣做基于2個事實,第一、大部分對象很快就不再使用,第二,還有一部分不會立即無用,但也不會持續(xù)很長時間。

虛擬機中劃分為年輕代、老年代、和永久代。

1>年輕代:主要用來存放新創(chuàng)建的對象,年輕代分為eden區(qū)和兩個Survivor區(qū)。大部分對象在Eden區(qū)中生成。當(dāng)Eden區(qū)滿時,還存活的對象會在兩個Survivor區(qū)交替保存,達(dá)到一定次數(shù)的對象會晉升到老年代。

2>老年代:用來存放從年輕代晉升而來的,存活時間較長的對象。

3>永久代:主要保存類信息等內(nèi)容,這里的永久代是指對象劃分方式,不是專指1.7的permGen,或者1.8之后的metaspace。

根據(jù)年輕代與老年代的特點,jvm提供了不同的垃圾回收算法。垃圾回收算法按類型可以分為引用計數(shù)法、復(fù)制法和標(biāo)記清除法。

其中引用計數(shù)法是通過對象被引用的次數(shù)來確定對象是否被使用,缺點是無法解決循環(huán)引用的問題。

復(fù)制算法需要from和to兩塊相同大小的內(nèi)存空間,對象分配時只在from塊中進行,回收時把存活對象復(fù)制到to塊中,并清空from塊,然后交換兩塊的分工,即把from塊作為to塊,把to塊作為from塊。缺點是內(nèi)存使用率較低。

標(biāo)記清除算法分為標(biāo)記對象和清除不在使用的對象兩個階段,標(biāo)記清除算法的缺點是會產(chǎn)生內(nèi)存碎片。

jvm中提供的年輕代回收算法Serial、ParNew、Parallel Scavenge都是復(fù)制算法,而CMS、G1、zgc都屬于標(biāo)記清除算法。

本篇文章,對這幾個算法就不展開了

總結(jié):面試考察點及加分項

1.jvm相關(guān)的面試考察點

首先,需要jvm的內(nèi)存模型和java的內(nèi)存模型;

其次,要了解的類的加載過程,了解雙親委派機制;

第三,要理解內(nèi)存的可見性與java內(nèi)存模型對原子性、可見性、有序性的保證機制;

第四,要了解常用的gc算法的特點、執(zhí)行過程,和適用場景,例如g1適合對大延遲有要求的場合,zgc適用于64為系統(tǒng)的大內(nèi)存服務(wù)中;

第五,要了解常用的jvm參數(shù),明白對不同參數(shù)的調(diào)整會有怎樣的影響,適用什么樣的場景。例如垃圾回收的并發(fā)數(shù)、偏向鎖設(shè)置等

2.相關(guān)加分項

如果想要面試官對你留下更好的印象的話,注意這些加分項:?

  • 首先,如果在編譯器優(yōu)化方面有深入的了解的話,會讓面試官覺得你對技術(shù)的深度比較有追求。例如知道在編程時如何合理利用棧上分配降低gc壓力、如何編寫適合內(nèi)聯(lián)優(yōu)化等代碼等。

  • 其次,如果你能有線上實際問題的排查經(jīng)驗或思路那就更好了,面試官都喜歡動手能力強的同學(xué)。例如解決過線上經(jīng)常full gc問題,排查過內(nèi)存泄露問題等。

  • 第三,如果能有針對特定場景的jvm優(yōu)化實踐或者優(yōu)化思路,也會有意想不到的效果。例如針對高并發(fā)低延遲的場景,如何調(diào)整gc參數(shù)盡量降低gc停頓時間,針對隊列處理機如何盡可能提高吞吐率等;

  • 第四,如果對最新的jvm技術(shù)趨勢有所了解,也會給面試官留下比較深刻的印象。例如了解zgc高效的實現(xiàn)原理,了解Graalvm的特點等。

總之,掌握以上具體的JVM考點,才能在面試時應(yīng)答自如。希望讀完此篇文章的你,能做好準(zhǔn)備,拿到心儀的Offer。


文末彩蛋

針對于上面所涉及到的知識點我總結(jié)出了有1到5年開發(fā)經(jīng)驗的程序員在面試中涉及到的絕大部分架構(gòu)面試題及答案做成了文檔和架構(gòu)視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發(fā)等架構(gòu)技術(shù)資料),希望能幫助到您面試前的復(fù)習(xí)且找到一個好的工作,也節(jié)省大家在網(wǎng)上搜索資料的時間來學(xué)習(xí),也可以關(guān)注我一下以后會有更多干貨分享。

資料獲取方式 QQ群搜索“708-701-457” 即可免費領(lǐng)取

95%的技術(shù)面試必考的JVM知識點都在這,另附加分思路!
95%的技術(shù)面試必考的JVM知識點都在這,另附加分思路!
95%的技術(shù)面試必考的JVM知識點都在這,另附加分思路!

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

文章題目:95%的技術(shù)面試必考的JVM知識點都在這,另附加分思路!-創(chuàng)新互聯(lián)
分享鏈接:http://muchs.cn/article2/pshic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣自適應(yīng)網(wǎng)站、面包屑導(dǎo)航、域名注冊、外貿(mào)建站、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作