針對高階java面試所總結需要會的技術及面試會問的問題
一、Java相關
樂觀悲觀鎖的設計,如何保證原子性,解決的問題;
char和double的位元組,以及在記憶體的分佈是怎樣;
物件記憶體佈局,然後講下物件的死亡過程?
物件頭,詳細講下;
sync原理詳細,sync內拋異常會怎樣,死鎖嗎?還是釋放掉?怎麼排查死鎖?死鎖會怎樣?有沒有什麼更好的替代方案?
詳細講一下集合,HashSet原始碼,HashMap原始碼,如果要執行緒安全需要怎麼做?
多執行緒是解決什麼問題的?執行緒池解決什麼問題?
執行緒池,如何設計的,裡面的引數有多少種,裡面的工作佇列和執行緒佇列是怎樣的結構,如果給你,怎樣設計執行緒池?
AQS原理,ReentranLock原始碼,設計原理,整體過程。
繼續聊多執行緒原始碼,sync原理,然後一個場景設計題;
float f = 1.4f;double d = 1.4d; 與 float f =1.5f;double d = 1.5d; 是否為true,記憶體是怎樣的;
split的原始碼,split("a|b|c");得出多少個數組;
把所有認識熟用的JUC(java.util.concurrent(簡稱JUC)包)下的類寫出來,講下使用,然後講下原生的執行緒操作;
開閉原則,解析工廠方法模式,建造者模式,區別。手擼出來。
講下JVM的大頁模式,JVM記憶體模型;
什麼是敏捷開發,防禦性程式設計,並行程式設計。Team Leader的思考;
逃逸分析是什麼,作用是什麼,用途是什麼;
怎麼認為一個類是執行緒安全?執行緒安全的定義是什麼?Java有多少個關鍵字進行同步?為什麼這樣設計?(聊了一大堆,一堆為什麼);
兩個執行緒設計題。記得一個是:t1,t2,t3,讓t1,t2執行完才執行t3,原生實現。
寫個字尾表示式,為什麼要設計字尾表示式,有什麼好處?然後寫下中綴。
我看你做過效能優化,比如你怎麼分析專案裡面的OOM的,記憶體洩露呢?詳細說思路;
說下多執行緒,我們什麼時候需要分析執行緒數,怎麼分析,分析什麼因素;
抽象方法和類方法的區別,static的抽象方法可以嗎?
說下Java的克隆體系;
涉及OOM、JVM優化、原始碼問題、資料庫優化、多執行緒等問題;
CPU高?什麼情況CPU高?解決什麼問題?
你有遇到過臨界區問題嗎?有遇到過嗎?你在專案遇到這個問題是怎樣解決的?
volatile關鍵字作用;
Java的多型怎麼實現;
解釋一下自旋;
解釋一下訊號量;
什麼情況下會觸發類載入;
Java記憶體抖動嚴重,優化的思路;
二、資料庫相關
SQL優化思路,聯合索引與底層樹結構的映像關係,索引結構(B+、B-),為什麼用這樣的結構;
講下MySQL的叢集?叢集遇到過什麼問題?sql的優化?
你目前為止遇到的最大資料量是多少?知道100萬時候怎麼設計嗎?1000萬呢?過幾十億呢?
MySQL有多少個引數可調,除了最大連線數。全部列出來,一個個分析。
聊下優化過的索引,怎麼優化;
紅黑樹和平衡樹的區別,為什麼資料庫不用紅黑樹;
mysql有哪些鎖,意向鎖有什麼用;
資料庫高併發下的優化思路;
資料庫什麼情況下索引會失效;
三、資料結構和作業系統相關
資料結構學過吧,聊一下?學過什麼結構?講下樹和佇列?B樹呢?
作業系統學過吧,聊一下?講一下系統記憶體是怎樣的?分段分頁虛擬記憶體?
頁面置換演算法呢?多少種?有最優的置換演算法嗎?
你學過什麼課程?然後聊下作業系統,核心、使用者之類。
反轉連結串列手擼;
快排,給一串陣列,把具體每次patition寫下,最終結果也寫45, 32, 41, 35, 38, 20, 50;
一個整數status, 判斷第K個位元位是否為位元1;
把遞迴實現的快排改成非遞迴,你知道非遞迴有什麼好處嗎;
舉例使用分治思想的演算法;
四、網路相關
講下請求頭細節?
Http和Https?Http1.0,1.1,2.0,講下長連線和短連線?Https是怎樣的?如果我篡改了公鑰呢?怎麼防止?
Get和Post,講下區別,要我模擬出抓包來。
詳細講下Cookie和Session,Token,OAuth2.0協議;
擁塞演算法知道嗎?哪些,分別怎樣?
學過計算機網路是吧?socket熟悉嗎?對它的讀寫緩衝區有理解嗎?怎麼的?那滑動視窗是怎樣的?為什麼這樣設計?
再聊下Http的Http basicauthentication;
Https的過程;
五、框架相關
聊下Spring原始碼,知道多少,都聊一下;
聊下Spring註解,@Autowire,@Resource,以及他們的解析過程;
聊一下架構,接入層架構,服務層架構。聊下技術棧,Spring Boot,Spring Cloud、Docker;
Spring ioc的具體優勢,和直接New一個物件有什麼區別;
Servlet生命週期,是否單例,為什麼是單例;
Spring Mvc初始化過程;
五、分散式相關
多少種RPC框架?
一致性雜湊是幹嘛的?
搭建高併發高可用系統需要怎樣設計?考慮哪些東西,有多少說多少。
你對快取有什麼理解?快取是解決什麼問題?後端快取有哪些,分別解決什麼問題?
聊一下分散式鎖;
你是怎麼設計系統快取的,為什麼,什麼場景;
也來說下,削峰的多種實現,Redis?MQ?
為什麼用mq就能削峰?解決什麼問題?
六、設計題
有幾臺機器儲存著幾億淘寶搜尋日誌,你只有一臺2g的電腦,怎麼選出搜尋熱度最高的十個搜尋關鍵詞;
如何設計演算法壓縮一段URL;
有一個頁面能同時展示兩個廣告,現在有五個廣告,設計演算法使五個廣告展示概率為1:2:3:4:5;
有25匹馬,五個賽道,用最少比賽次數將25匹馬排序;
七、多執行緒
AtomicInteger底層實現原理;
synchronized與ReentraLock哪個是公平鎖;
CAS機制會出現什麼問題;
用過併發包下邊的哪些類;
一個執行緒連著呼叫start兩次會出現什麼情況?
wait方法能不能被重寫,wait能不能被中斷;
執行緒池的實現?四種執行緒池?重要引數及原理?任務拒接策略有哪幾種?
執行緒狀態以及API怎麼操作會發生這種轉換;
常用的避免死鎖方法;
八、JVM
Minor GC與Full GC分別在什麼時候發生?什麼時候觸發Full GC;
GC收集器有哪些?CMS收集器與G1收集器的特點。
Java在什麼時候會出現記憶體洩漏;
Java中的大物件如何進行儲存;
rt.jar被什麼類載入器載入,什麼時間載入;
自己寫的類被什麼載入,什麼時間載入;
自己寫的兩個不同的類是被同一個類載入器載入的嗎?為什麼?
為什麼新生代記憶體需要有兩個Survivor區?
幾種常用的記憶體除錯工具:jmap、jstack、jconsole;
類載入的五個過程:載入、驗證、準備、解析、初始化;
G1停頓嗎,CMS回收步驟,CMS為什麼會停頓,停頓時間;
棧主要存的資料是什麼,堆呢?
堆分為哪幾塊,比如說新生代老生代,那麼新生代又分為什麼?
軟引用和弱引用的使用場景(軟引用可以實現快取,弱引用可以用來在回撥函式中防止記憶體洩露);
九、Linux基礎
Linux下可以在/proc目錄下可以檢視CPU的核心數等;cat/proc/下邊會有很多系統核心資訊可供顯示;
說一下棧的記憶體是怎麼分配的;
Linux各個目錄有了解過嗎?/etc、/bin、/dev、/lib、/sbin這些常見的目錄主要作用是什麼?
說一下棧幀的記憶體是怎麼分配的;
Linux下排查某個死迴圈的執行緒;
動態連結和靜態連結的區別;
程序的記憶體分佈;
如何查詢一個程序開啟所有的檔案;
說一下常使用的協議及其對應的埠;
為什麼會有核心態,保護模式你知道嗎?
檔案是怎麼在磁碟上儲存的?
有了程序為何還要執行緒呢,不同程序和執行緒他們之間有什麼不同。(程序是資源管理的最小單位,執行緒是程式執行的最小單位。在作業系統設計上,從程序演化出執行緒,最主要的目的就是更好的支援SMP以及減小(程序/執行緒)上下文切換開銷。)
InnoDB聚集索引B+樹葉子節點和磁碟什麼順序相同;
檔案系統,程序管理和排程,記憶體管理機制、虛地址保護模式;
十、其他相關
Tomcat快取,聊下快取的整體理解,知道多少種快取;
解釋下Mucene原理,倒排索引,怎樣進行中文分詞,基於什麼進行分詞;
TopN的大資料量題;
你對接入層要思考什麼東西?遇到過哪些問題?搭建系統要考量哪些因素?
然後專案問題,優化問題;
熟悉maven是吧?我們來聊下Maven的原始碼原理,Maven衝突的時候,怎麼選擇依賴包,我們怎麼查,我們遇到兩個不一樣的版本,我們應該如何去選擇,為什麼?
專案如何分組,效能優化小組應該做哪些;
我們來說下接入層的搭建,認知分析;
問下專案的系統構建,思考,為什麼這樣構建?
如何判斷一段程式碼的好壞;