當前位置:
首頁 > 知識 > 關於Java面試,你應該準備這些知識點

關於Java面試,你應該準備這些知識點

來自:簡書 佔小狼


鏈接:http://www.jianshu.com/p/fa0085a0cdf9


自天子以至於庶人,壹是皆以修身為本《禮記·大學》

關於Java面試,你應該準備這些知識點



馬老師說過,員工的離職原因很多,只有兩點最真實:


錢,沒給到位

心,受委屈了


當然,我是想換個平台,換個方向,想清楚為什麼要跳槽,如果真的要跳槽,想要拿到一個理想的offer,除了運氣,基本功也要足夠的紮實,希望下面的面試經驗能給你們能夠提供一些幫助。


項目經驗


面試官在一開始會讓你進行自我介紹,主要是想讓你介紹一下自己做過的一些項目,看看你對這些項目的了解程度,因為很多人簡歷上寫的項目並非都是從頭到尾都參與的,有些只是參與並實現了其中的一些模塊而已,或是接手維護別人的項目,所以在你簡歷上所寫的和面試過程中所說的項目經驗,你自己必須能夠了解來龍去脈,因為面試官肯定會根據你的項目描述,對項目中的實現原理,或為什麼要這樣實現進行提問,這時不至於木訥住而不知如何作答,如此局面只會大大降低面試分。


場景對話:

面試官:(拿著簡歷)講講你最近做的這個項目


我:&……%¥#*&¥@%¥!,說了一大通(不知道面試官聽進去多少,面試官會挑他會的進行提問)


面試官:你說這個項目中用到了netty,能大概講講netty的線程模型么?


我:(幸好我看過netty的源碼)netty通過Reactor模型基於多路復用器接收並處理用戶請求(能講就多講一點),內部實現了兩個線程池,boss線程池和work線程池,其中boss線程池的線程負責處理請求的accept事件,當接收到accept事件的請求時,把對應的socket封裝到一個NioSocketChannel中,並交給work線程池,其中work線程池負責請求的read和write事件(通過口述加畫圖的方式,把請求的執行過程大概描述了一遍,時間有限,也不可能把所有的細節都說完,挑重點講,挑記憶深刻的講)


面試官:嗯,理解的還挺深入的...那你在做這個項目時有沒有遇到什麼困難,或者是覺得有挑戰的地方?

我:(這時面試官想讓你自己出題自己回答了,所以一定要回答,不回答就突顯不出你這個項目了,要是這個問題沒有準備過,只能臨時發揮了,當然我就是屬於臨時發揮的)稍微想一下,因為之前確實碰到了這個問題,當時做這個項目時,對netty的不過熟悉,把請求的業務邏輯放在work線程池的線程中進行處理,進行壓測的時候,發現qps總是上不去,後來看了源碼之後才發現,由於業務邏輯的處理比較耗時,完全佔用了work線程池的資源,導致新的請求一直處於等待狀態。


面試官:那最後是如何解決的?


我:最後把處理業務的邏輯封裝成一個task提交給一個新建的業務線程池中執行,執行完之後由work線程池執行請求的write事件。


面試官:好的,你知道nio中selector可能觸發bug么?

我:嗯,對的,selector的select方法,因為底層的epoll函數可能會發生空轉,從而導致cpu100%。


面試官:那如何解決該問題?


我:這個問題在netty已經解決了,通過&^%&$^(把netty的解決方案說一遍)


面試官:嗯,對了,你們這個項目有給自己定指標么?


我:有的,&&…………¥¥##@,把自己項目的指標說了一通,如何進行AB實驗,如何迭代優化指標


面試官:嗯,好的 ,項目的問題先到這裡,我們來考察一下java的基本點吧。


如上只是本人所做的一個項目,當然了,具體項目具體分析,也不是每個面試官問的點都一樣,如果面試官不懂netty,自然會挑別的問題進行提問,不過你也可以嘗試著把問題往自己熟悉的方向去靠。


面試知識點1、線程池


線程池的實現原理,這個知識點真的很重要,幾乎每次面試都會被問到,一般的提問方式有如下幾種:


1、「講講線程池的實現原理」


2、「線程池中的coreNum和maxNum有什麼不同」


3、「在不同的業務場景中,線程池參數如何設置」


場景對話:


面試官:平時線程池用的多麼?


我:嗯,我的*項目中就用到了


面試官:那好,你講講線程池的實現原理


我:(還好我之前看過源碼,但是時間久遠有點模糊了),能給我筆和紙么,我畫圖分析給你看看,&&¥&假設初始化一個線程池,核心線程數是5,最大線程數是10@@@


面試官:嗯,好的,你繼續...


我:在紙上畫了正方形,這個代表一個線程池,初始化的時候,裡面是沒有線程的


面試官:嗯,好的,你繼續...


我:又畫了一個細長的長方形,這個代表阻塞隊列,一開始裡面也是沒有任務的


面試官:嗯,好的,你繼續...


我:當來了一個任務時,在正方形中畫了一個小圓圈,代表初始化了一個線程,如果再來一個任務,就再畫一個圓圈,表示再初始化了一個線程,連續畫了5個圓圈之後,如果第6個任務過來了...


面試官:嗯,好的,你繼續...


我:這時會把第6個任務放到阻塞隊列中..


面試官:嗯,然後呢?


我:現在線程池中不是有5個線程了么,如果其中一個線程空閑了,就會從阻塞隊列中獲取第6個任務,進行執行..


面試官:嗯,對的,那如果任務產生的速度比消費的速度快呢?


我:如果線程池的5個線程都在running狀態,那麼任務就先保存在阻塞隊列中


面試官:如果隊列滿了,怎麼辦?


我:如果隊列滿了,我們不是設置了最大線程數是10么,而線程池中只有5個線程,這時會新建一個線程去執行不能保存到阻塞隊列的任務,然後我又在正方形中畫了5個圓圈。


面試官:那如果線程池中的線程數達到10個了,阻塞隊列也滿了,怎麼辦?


我:這種情況通過自定義reject函數去處理這裡任務了,舒了一口去,以為問完了...


面試官:好的,那如果運行一段時間之後,阻塞隊列中的任務也執行完了,線程池中的線程會怎麼樣?


我:...這個好像超過核心線程數的線程會在空閑一段時間內自動回收...因為有點不記得這個邏輯了,回答的有點虛...


面試官:好的,那這種情況在什麼場景下會發生?


我:(有時候真是笨啊,很多東西都知道,但是在面試的時候一緊張,全忘記)這個...那個...我好像沒有遇到過這樣的情況


面試官:嗯,好的,你回去之後再好好想想


我:........


我居然忘記了秒殺這個場景


線程池分析的文章:


深入分析java線程池的實現原理


2、鎖的實現


在關於鎖的面試過程中,一般主要問Synchronized和ReentrantLock的實現原理,更有甚者會問讀寫鎖。


場景對話:


面試官:都了解Java中的什麼鎖?


我:比如Synchronized和ReentrantLock...讀寫鎖用的不多,就沒研究了(我就怕被問讀寫鎖,因為一直沒去看)


面試官:那好,你先說說Synchronized的實現原理吧


我:嗯,Synchronized是JVM實現的一種鎖,其中鎖的獲取和釋放分別是monitorenter和monitorexit指令,該鎖在實現上分為了偏向鎖、輕量級鎖和重量級鎖,其中偏向鎖在1.6是默認開啟的,輕量級鎖在多線程競爭的情況下會膨脹成重量級鎖,有關鎖的數據都保存在對象頭中...&&@@#,(嗯,說了一大堆,面試官也沒打斷我)


面試官:哦,嗯,理解的還挺透徹,那你說說ReentrantLock的實現吧...


我:ReentrantLock是基於AQS實現的


面試官:什麼是AQS?


我:在AQS內部會保存一個狀態變數state,通過CAS修改該變數的值,修改成功的線程表示獲取到該鎖,沒有修改成功,或者發現狀態state已經是加鎖狀態,則通過一個Waiter對象封裝線程,添加到等待隊列中,並掛起等待被喚醒&&&$$(又說了一堆)


面試官:能說說CAS的實現原理么?


我:CAS是通過unsafe類的compareAndSwap方法實現的(心裡得意的一笑)


面試官:哦,好的,那你知道這個方法的參數的含義的么?


我:(這是在逼我啊...努力的回想,因為我真的看過啊)我想想啊,這個方法看的時間有點久遠了,第一個參數是要修改的對象,第二個參數是對象中要修改變數的偏移量,第三個參數是修改之前的值,第四個參數是預想修改後的值....(說出來之後都有點佩服自己,這個都記得,不過面試官好像還是不肯放過我...)


面試官:嗯,對的,那你知道操作系統級別是如何實現的么?


我:(我去你大爺...)我只記得X86中有一個cmp開頭的指令,具體的我忘記了...


面試官:嗯,好,你知道CAS指令有什麼缺點么


我:哦,CAS的缺點是存在ABA問題


面試官:怎麼講?


我:就是一個變數V,如果變數V初次讀取的時候是A,並且在準備賦值的時候檢查到它仍然是A,那能說明它的值沒有被其他線程修改過了嗎?如果在這段期間它的值曾經被改成了B,然後又改回A,那CAS操作就會誤認為它從來沒有被修改過。


面試官:那怎麼解決?


我:(有完沒完了啊...我的心裡是崩潰的)針對這種情況,java並發包中提供了一個帶有標記的原子引用類"AtomicStampedReference",它可以通過控制變數值的版本來保證CAS的正確性。


面試官:嗯,好的,這個問題到此為止,我們再看看別的


我:....我能喝口水么


關於鎖分析的文章,希望對大家有用:


深入淺出java同步器AQS


java中的CAS


深入淺出synchronized


深入淺出ReentrantLock


java中的Unsafe


java volatile關鍵字解惑


深入分析Object.wait/notify實現機制


深入分析synchronized的JVM實現


3、ConcurrentHashMap


當考察數據結構時,面試官一開始會問HashMap的實現原理,當你說出HashMap並非線程安全之後,會讓你自己引出ConcurrentHashMap,接著就可能開始如下的對話。


場景對話:


面試官:談談ConcurrentHashMap實現原理


我:@#¥@@基於分段鎖的%%¥#@#¥,但是1.8之後改變實現方式了


面試官:1.8啥方式


我:把1.8的實現原理說了一通,其中提到了紅黑樹...


面試官:能講下紅黑樹的概念嗎


我:紅黑樹是一種二叉樹,並且是平衡……%……¥……,


面試官:能講下紅黑樹的。。。。。


我:打住,別問了,紅黑樹我只知道他是二叉樹,比其他樹多一個屬性,其他的我都不知道


面試官:好的,那換個,你知道它的size方法是如何實現的么?


我:size方法?是想要得到Map中的元素個數么?


面試官:對的....


我:我記得好像size方法返回是不準確的,平時也不會用到這個方法...


面試官:如果你覺得size方法返回值不準確,那如果讓你自己實現,你覺得應該怎麼實現呢?


我:...@#¥@@...兩眼一黑


我:等等,讓我想想.....應該可以用AtomicInteger變數進行記錄...嗯,對的,每次插入或刪除的時候,操作這個變數,我得意的一笑...


面試官:哦,是么,那如果我覺得這個AtomicInteger這個變數性能不好,還能再優化么?


我:懵逼臉...(當時居然把volitile變數給忘記了)...好像沒有了,我想不出來了...


面試官:哦,那回頭你再看看源碼吧,jdk中已經實現了...


我:哦,是么....


面試官:那今天的面試到此結束,我們後面會通知你。


我:..................


關於ConcurrentHashMap,本人也寫過不少的分析文章,希望對大家有用:


深入淺出ConcurrentHashMap(1.8)


談談ConcurrentHashMap1.7和1.8的不同實現


ConcurrentHashMap的紅黑樹實現分析


深入分析ConcurrentHashMap1.8的擴容實現


虛擬機JVM相關


這塊內容並非每個面試官都會問,但是如果是應聘高級職位的話,這一環節是不可缺少的,面試的難易程度也不一樣,有些面試官或許讓你講講虛擬機的內存模型即可,有些也會讓你解釋垃圾回收的實現,當然也會有虛擬機調優的實戰經驗,線上問題排查等等。


場景對話:


面試官:Java虛擬機有了解么?


我:恩,略有接觸過...(水哥說過,話不能說太滿,容易打臉)


面試官:那你先講講它的內存模型吧


我:Java堆,Java棧,程序計數器,方法區,1.7的永久代,1.8的metaspace....(噼里啪啦概念講一通,簡短描述下每個內存區的用途,能想到的都講出來,不要保留,不要等面試官問 「還有嗎?」)


面試官:好,一般Java堆是如何實現的?


我:在HotSpot虛擬機實現中,Java堆分成了新生代和老年代,我當時看的是1.7的實現,所有還有永久代,新生代中又分為了eden區和survivor區,survivor區又分成了S0和S1,或則是from和to,(這個時候,我要求紙和筆,因為我覺得這個話題可以聊蠻長時間,又是我比較熟悉的...一邊畫圖,一邊描述),其中eden,from和to的內存大小默認是8:1:1(各種細節都要說出來...),此時,我已經在紙上畫出了新生代和老年代代表的區域


面試官:恩,給我講講對象在內存中的初始化過程?


我:(千萬不要只說,新對象在Java堆進行內存分配並初始化,或是在eden區進行內存分配並初始化)要初始化一個對象,首先要載入該對象所對應的class文件,該文件的數據會被載入到永久代,並創建一個底層的instanceKlass對象代表該class,再為將要初始化的對象分配內存空間,優先在線程私有內存空間中分配大小,如果空間不足,再到eden中進行內存分配...^&&*%


面試官:恩,好,說下YGC的大概過程...


我:先找出根對象,如Java棧中引用的對象、靜態變數引用的對象和系統詞典中引用的對象等待,把這些對象標記成活躍對象,並複製到to區,接著遍歷這些活躍對象中引用的對象並標記,找出老年代對象在eden區有引用關係的對象並標記,最後把這些標記的對象複製到to,在複製過程還要判斷活躍對象的gc年齡是否已經達到閾值,如果已經達到閾值,就直接晉陞到老年代,YGC結束之後把from和to的引用互換(能多說點就多說點,省的面試官再提問,我把老年代的cms回收也大致說了一遍,以為面試官會跳過這個話題了,還是太年輕了)。


面試官:你剛剛說到在YGC的時候,有些對象可能會發生晉陞,如果晉陞失敗怎麼處理?


我:....(斷片了幾秒鐘,我記得我分析過這段代碼的,但是印象不深刻了)我記得在標記階段時,會把對象和對應的對象頭數據保存在兩個棧中,如果晉陞失敗的話,就把該對象的對象頭復原...


面試官:那你在實際項目中有碰到這種情況么,會導致什麼問題?


我:...(這我真沒有遇到過)對,有遇到過一次,在分析gc日誌的時候,發現YGC發生之後,日誌顯示gc後的內存變大了,後來查出來是因為對象的晉陞失敗造成的。(我隱約記得看過笨神的一篇文章,回答的心裡很虛)


面試官:(沒有反駁,繼續問)有過虛擬機性能調優的經驗么?


我:(說實話,調優經驗真的不多)恩,有一點吧,不是很足,就是我們XX項目上線的時候,發現YGC特別的頻繁^^&^8&,通過調整新生代的大小(線上環境的虛擬機參數是默認的),同時檢查業務邏輯代碼&*&$$~~!


面試官:恩?還有么?


我:(面試這麼久,好怕面試官的下一句是 「恩?還有么?」,顯然面試官還不滿足我的回答,但是我也只能答到這個地步了...)恩,經驗確實有限,目前就根據這個項目做過一些相關的優化。


面試官: 。。。。。。


我:。。。。。。


面試官: 那我們看看別的吧。


關於虛擬機方面的文章,我針對hotSpot的實現寫了一些分析,感興趣的同學可以看看,這些文章看著確實有點枯燥。


相關文章:


JVM源碼分析之JVM啟動流程


JVM源碼分析之堆內存的初始化


JVM源碼分析之Java類的載入過程


JVM源碼分析之Java對象的創建過程


JVM源碼分析之如何觸發並執行GC線程


JVM源碼分析之垃圾收集的執行過程


JVM源碼分析之新生代DefNewGeneration的實現


JVM源碼分析之老年代TenuredGeneration的垃圾回收演算法實現


細節問題


細節決定成敗,在面試過程中,雖然也有運氣的成分存在,但是對於細節的掌握程度,可以很好的衡量應試者的技術水平。


volatile


場景對話:


面試官:說說volatile關鍵字的實現原理


我:volatile關鍵字提供了內存可見性和禁止內存重排序


面試官:分別解釋一下


我:因為在虛擬機內存中有主內存和工作內存的概念,每個cpu都有自己的工作內存,當讀取一個普通變數時,優先讀取工作內存的變數,如果工作內存中沒有對應的變數,則從主內存中載入到工作內存,對工作內存的普通變數進行修改,不會立馬同步到主內存,內存可見性保證了在多線程的場景下,保證了線程A對變數的修改,其它線程可以讀到最新值&&%%……


面試官:如何保證的?


我:當對volatile修飾的變數進行寫操作時,直接把最新值寫到主內存中,並清空其它cpu工作內存中該變數所在的內存行數據,當對volatile修飾的變數進行讀操作時,會讀取主內存的數據&&&%%¥@


面試官:你知道系統級別是如何實現的么?


我:(what,what are u 說啥呢)我記得操作volatile變數的彙編代碼前面會有lock前綴指令


面試官:你這說的還是代碼層面,我說的是系統級別


我:(懵逼臉...)這個再底層下去我真的沒研究過了...


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序猿 的精彩文章:

逐浪IDC,廣東移動極速前進擁抱雲時代
讓生活「黑客」起來
大數據分頁方案
想進互聯網大廠?你應該知道這些秘密!
前端開發技能表

TAG:程序猿 |

您可能感興趣

baby都喊話,沒準備好,專家教你應對產後這7件尷尬事!
Finger Live直播,你們準備好了嗎?
短髮還可以這麼玩,準備好你的freestyle了嗎?
來一段Freestyle之前,你需要做好如下準備工作!
當你準備做一個紋身,你最care的是什麼?
孕前: 你應該要做的一些準備!
面試前,你需要這樣準備
這就是你要的iPhone8,準備好你的腎
iphone8這一次改變不止一點點,你們的money準備好了嗎?
如果你來Google IO,千萬不要錯過這場為你準備的人工智慧論壇
如果你不想等蘋果iPhone8,而準備買iPhone7,這些爆款周邊不帶走一個就太可惜了!
如果你來Google IO, 千萬不要錯過這場為你準備的人工智慧論壇
做真男人,就要準備一件像樣的裝備,還沒有那你真是out了
準備為信仰充值?堅果Pro的這9件事你該知道一下
一場Music n』 Racing 時裝音樂派對即將引燃,你準備好了嗎!
一場 Music n』 Racing 時裝音樂派對即將引燃,你準備好了嗎!
關於懷孕前的這些準備你一定要知道!
蘋果準備再一次震驚世界,只不過這次不是iPhone,而是Apple Watch 3
三星Note8應該就長這樣 看完趕緊準備錢吧