一211大學畢業生工作五年後,被騰訊70多道面試題問迷茫了!
背景
211畢業至今剛好五年,我曾做過兩三個月的測試感覺不是很合適,後面選擇從事後端開發,還挺香。現在已經進入秋招的提前批了,想著去大廠試試水,就去了騰訊,整個一面下來我整個人都傻了,表示懷疑人生...沒想過一面就能問這麼多,瘋狂轟炸,連環70多問,不得停歇。感覺我這輩子都不會忘記這次面試經歷了,給大家看看我的面試過程,我想,恐怕你也會表示同感。
我的面試過程(歷經70mins)
1、個人履歷簡述
2、專案簡述
- 主要突出重難點,我bb了一堆業務邏輯結果人家都不感興趣
3、SpringAOP實現
- JDK動態代理:實現Invocationhandler介面,本質上是new一個繼承了所有類上Interface的Proxy物件,然後通過method.invoke進行呼叫
- CGLib動態代理:在記憶體中動態生成子類對原物件進行代理,無法代理final類以及方法
- 共同限制:無法代理到當前class當中this引用的巢狀方法
4、AOP用的哪種?
- 預設用的JDK動態代理
5、JDK動態代理以及CGLib動態代理效能比較
- JDK走的反射,會多一些反射呼叫的開銷(方法許可權驗證、呼叫開銷等)
- CGLib需要建立新物件,在建立新物件上,即初始化時會多一些開銷
6、Java的執行緒池用過嗎,具體引數講一下
Java的執行緒池是一個三級儲存結構,執行緒先放入核心執行緒池,滿了之後放到快取佇列當中,最後如果快取佇列也滿了則擴容新執行緒,所以引數有:
- 核心執行緒數量
- 快取佇列型別
- 最大執行緒數量
- 執行緒活躍時間
- 執行緒工廠方法(寫日誌、重新命名執行緒等)
7、執行緒池的Execute和Submit區別
- Execute執行runnable,Submit可以執行Future,我們一般用countDownLatch+Future來獲取所有的執行緒結果
8、繼續問,還有別的區別嗎?
- 不知道了,後續查了發現區別如下
- Execute會在執行期直接丟擲異常,Submit之後在呼叫Future.get的時候才會丟擲異常
9、執行緒池如何保證當前執行緒獲取池內的worker的時候不產生爭用
- volatile的state標誌這個worker有沒有被使用
10、volatile的特性
- 通過禁止指令重排序來保證記憶體可見性,實際使用記憶體屏障實現的
11、記憶體屏障分幾種?
當時記不得了,回頭查了一下如下:
- LoadLoad屏障:對於這樣的語句Load1; LoadLoad; Load2,在Load2及後續讀取操作要讀取的資料被訪問前,保證Load1要讀取的資料被讀取完畢。
- StoreStore屏障:對於這樣的語句Store1; StoreStore; Store2,在Store2及後續寫入操作執行前,保證Store1的寫入操作對其它處理器可見。
- LoadStore屏障:對於這樣的語句Load1; LoadStore; Store2,在Store2及後續寫入操作被刷出前,保證Load1要讀取的資料被讀取完畢。
- StoreLoad屏障:對於這樣的語句Store1; StoreLoad; Load2,在Load2及後續所有讀取操作執行前,保證Store1的寫入對所有處理器可見。它的開銷是四種屏障中最大的。在大多數處理器的實現中,這個屏障是個萬能屏障,兼具其它三種記憶體屏障的功能。
12、除了在volatile當中使用了記憶體屏障,JAVA還有哪裡使用了記憶體屏障
- 這個真不知道,知道的小夥伴請在評論區指點一二
13、你之前講到了CountDownLatch,你知道它的內部實現嗎
- 知道,用的AQS,在state=0的時候才允許所有等待的執行緒全部通過
14、簡單講一下AQS
AQS核心設計:
- 一個volatile int state的狀態值,使用volatile保證執行緒可見性,使用int來提供可重入的多資源能力
- 雙向佇列,首節點為執行節點,可以根據執行節點的Node資訊判斷是ShareLock還是ExclusiveLock,會關聯一個執行執行緒,來提供可重入的判斷
- 加鎖的時候若是公平鎖則嘗試CAS載入佇列,若是非公平鎖則直接入佇列
- 解鎖的時候直接喚醒後繼的第一個wait節點
15、加鎖之後AQS是如何響應中斷的?
- 太細節了真不會,之前複習原始碼沒看這麼深(結束之後補漏洞)
16、OK問點別的,AQS存在什麼實現呢?
- 用過的ReentranceLock、CountDownLatch
17、講講實現
- ReentranceLock通過判斷執行緒是否相同進行衝入
- CountDownLatch在state為0的時候才讓所有的await通過
18、聽說過ReadWriteLock嗎,你之前提到AQS當中只有一個State那你如何用一個State去支撐讀寫兩種狀態
- 一個state是Int,可以分高位給Read,低位給Write,就當個String用了
19、Int幾個位元組
- 我居然回答了32個,應該是32位,8位一個byte,共計四個byte
20、你們用過快取嗎
- 沒有,但是用redis做了分散式鎖
21、你說說下分散式鎖怎麼做的?
- 分散式鎖也是一個鎖,需要滿足幾個特性,1 可重入 2 可以識別加鎖的身份防止ABA問題 3 考慮是否需要續約
- key是所需要加上的鎖的業務資源唯一編碼,value是當前執行緒的uuid,uuid存在threadLocal內 加鎖的時候用的jedis,先設一個過期時間,然後用ex,若不存在key則新增新key,若已經存在則直接失敗
- 解鎖用的阿里雲企業版的CAD(compareAndDelete),原子比較並解鎖,本質是通過lua指令碼進行的類似事務操作
22、除了redis還有什麼可以做分散式鎖?
- Mysql、zookeeper等
23、如果讓你用Mysql做分散式鎖你怎麼做
- 新建一張表,主鍵為需要鎖的鎖key,col1為執行緒uuid,col2為ttl時間
- 加鎖的時候在一個事務中選取當前key的record,若存在則判斷ttl,若不存在則直接可以插入
- 解鎖的時候直接把record刪除即可
- 起一個定時任務來遍歷表,清楚過期鍵防止無限膨脹
24、zookeeper瞭解嗎
- 一點點,攝入不深
25、那我們繼續聊聊Redis吧,Redis有什麼資料結構?
- List,Hash,Set,Zset,List
26、Zset怎麼實現的?
- 跳錶+map實現
27、什麼是跳錶?
- 常規連結串列只有一個next節點,跳錶持有多個指向其他連結串列的指標,可以跨越式的進行查詢,時間複雜度是logn
28、如果我要找一個score為A的節點應該如何去找?
- 首先在map中找到對應的node排名,然後根據排名在skiplist中進行查詢
29、zrange是如何實現的?
- 這個沒想到不應該,查了一下如下: ZRANGE key start stop [WITHSCORES],zrange 就是返回有序集 key 中,指定區間內的成員,而跳錶中的元素最下面的一層是有序的(上面的幾層就是跳錶的索引),按照分數排序,我們只要找出 start 代表的元素,然後向前或者向後遍歷 M 次拉出所有資料即可,而找出 start 代表的元素,其實就是在跳錶中找一個元素的時間複雜度。跳錶中每個節點每一層都會儲存到下一個節點的跨度,在尋找過程中可以根據跨度和來求當前的排名,所以查詢過程是 O(log(N) 過程,加上遍歷 M 個元素,就是 O(log(N)+M),所以 redis 的 zrange 不會像 mysql 的 offset 有比較嚴重的效能問題。
30、Redis持久化
- RDB:快照儲存,可以選擇是否阻塞,使用場景在資料庫上下線、主備複製等情況中
- AOF:類似於binlog,每個裡面都是一個寫事件,是優先讀取的策略,支援多策略寫入(強同步、按時間刷盤、交由作業系統決定刷盤等),AOF為了防止檔案膨脹也支援重寫
31、AOF重寫的時候會不會block主執行緒?
- 不會,沒有這個必要,起一個子執行緒重寫完畢之後把手頭的buffer在刷進去就行了
32、在載入的時候是怎麼做的
- 本地起一個client直接讀取AOF重放其中的命令
33、Redis有哪些多機部署方案?
- 經典的主備同步,通過RDB初始化備庫然後進行命令傳播 Sentinel,實際上是一種容災機制 cluster,叢集部署,使用多機佔用slot的方式進行叢集服務提供
34、在主備環境下,如果一個備庫中途斷鏈了,重新上線的時候怎麼執行同步?
- 主備各自維護一個寫入的Offset,對比差異之後在buffer中讀出丟失的命令並進行同步
35、如果備庫的offset過於落後已經不在buffer當中了呢?
- 直接RDB重新同步 使用AOF來查詢對應offset的語句(這個是我猜的)
36、cluster如何做的故障轉移?
- 不知道,估計也是檢測到客觀下線然後paxos選主
37、Mysql瞭解嗎,裡面有哪些鎖?
- 型別分類:共享鎖(S),獨佔鎖(X),意向鎖(與表鎖互斥)
- 粒度分類:行鎖、表鎖
38、行鎖怎麼實現的?
- 不知道,這個時候已經有點崩潰了,怎麼這麼多不知道nnd
39、講一下事務隔離級別吧
- RU、RC、RR、Serializable
40、你們用的是哪個隔離級別
- mysql預設的是RR,我們改成RC了
41、在預設隔離級別下會產生幻讀問題嗎?
- 會,這是幻讀是RR的經典問題之一
42、描述一下幻讀
- 在T1裡Select * From table where id = 1;若不存在該記錄則insert id = 1的記錄進去,但是在select完畢之後T2事務插入了id=1的record,此時後續insert執行失敗,本質上來講是當前的快照都不支援後續dml語句的執行
43、MVCC機制瞭解嗎?
- 瞭解,由undolog支撐的資料隔離機制,主要是為了提供更高的併發度
44、講一下原理
- 每一行record都存在兩個隱藏行,一個是當前的事務id,一個是指向undolog的指標 mvcc機制執行
- 在rr和rc兩個隔離級別下 在每次生成ReadView的時候,會將當前的活躍事務ID維護在列表當中,如果訪問的Record的ID比最小活躍事務的ID還要小說明之前已經提交了,可以直接讀取,如果與最大事務ID還要大就證明該事務在這個快照時沒提交,需要根據undolog去找對應的歷史版本,如果在最大和最小之間,那麼若其為活躍事務則找歷史版本,若不是則直接讀取
- 在RC級別下,每次Select都生成新的ReadView,所以能看到不同事物間的提交
- 在RR級別下,只在第一次Select的時候生成ReadView,所以會產生幻讀,因為快照讀和真實讀的結果不一致
45、慢sql怎麼處理?
- 撈慢sql日誌先分析寫的索引是不是有問題或者offset太大了,然後看expain
46、你關注explain的那些col?
- key:真實用到的索引
- possible_key:可能用的索引
- rows:掃描行數,越大越拉垮
- filter:過濾資料比例,這個col可以驗證索引有效性
- extra:包含是否使用索引、sort是否時filesort等
47、https瞭解嗎?
- client發一個隨機數給server
- server發證照+隨機數回來
- client拆證照找第三方驗證證照有效性,取出公鑰
- client拿公鑰加密第三個隨機數發server
- server私鑰解密
48、線上機器cpu100%你怎麼處理?
- 容器化時代,一定要top看下是不是st過高,存在超賣的可能性
- 如果不是的話top看下哪個程式有問題,然後看這個程式哪個執行緒吃了cpu
- jstack直接把執行緒dump出來然後找對應有問題的執行緒再分析
- 也有可能是記憶體洩漏導致的頻繁GC問題,可以拉GClog然後在jmap把heap dump出來看下
49、你們線上JVM一般調整什麼引數?
- XMX&XMS固定防止記憶體抖動
- 堆空間調整:年輕代Age調整、年輕代eden:s0:s1比例調整
- 收集器調整:大促前把CMS的預清理次數調低一些,CMS的清理閾值調高一些
50、反問
- 什麼團隊?
- 做什麼業務的?
自我反思
雖說這次是抱著試水的心態去的,但是這一連50問著實是有點傻眼了,而且也發現了自己的很多漏洞,如下:
- 我的簡歷過長,難以被面試官抓住重點
- 專案使用技術棧沒有體現出來
- 涉及相關專案重難點表述不是很清楚,分散式鎖、多租戶的分庫分表以及中介軟體隔離方案、效能問題排查等
- 各類技術棧停其實都還留在使用層,沒有深入去挖掘
- 語速太快了,70分鐘的面試大大小小回答了50個問題,我感覺放慢點夠我回答兩輪了
最後總結個人所得(供大家參考學習)
這次一面結束之後我反思很久,發現自己真的是有很多不足和漏洞,所以最近一直在規劃自己的學習路線去不足,不論你是複習備戰面試還是自己學習,我相信我所說的多少還是有點用處的。
1.1 首先,第一個應該去梳理整個體系的知識大綱
整個體系的知識大綱
我將整個體系分為5個專題:併發程式設計、效能調優、Spring全家桶、快取資料庫、分散式&微服務
1.2 其次,根據上面的分類,按照大綱來學習(最後看面試專題)
對於每一個專題,去搜集相應的面試學習筆記,比如下面我所收集的(若是對我收集的這份知識體系大綱以及下方每個專題對應的面試+學習筆記感興趣,小編可以免費分享給你一起學習;文末有領取方式!
1. 併發程式設計(手寫筆記:併發程式設計+併發程式設計_原理+併發程式設計_應用+併發程式設計_模式)
- 併發程式設計
併發程式設計
- 併發程式設計_原理
併發程式設計_原理
- 併發程式設計_應用
併發程式設計_應用
- 併發程式設計_模式
併發程式設計_模式
- 效能調優(Java效能調優實戰:Java程式設計效能調優+多執行緒效能調優+JVM效能監測及調優+設計模式調優+資料庫效能調優+實戰演練)
效能調優
- Spring全家桶(關注這一部分,我將Spring、MVC、Cloud、Boot歸整在一塊了)
- 手繪的各思維腦圖(幫助梳理知識點,比較多就不一一截圖了)
Spring全家桶手繪的各思維腦圖
- 進階學習的筆記
Spring全家桶進階學習的筆記
- 快取資料庫(主要是MySQL+Redis+MongDB)
MySQL+Redis+MongDB
- 分散式&微服務(整理的筆記如下)
分散式&微服務
1.3 最後來看面試專題
我從基礎-中級-高階開始一步一步逐步深入,這些面試問題一樣都有分類整理,私信我【學習】給你分享喔(附答案解析)。
- 比如基礎部分:
基礎部分
- 中級部分:
中級部分
- 高階部分(訊息佇列+Redis快取+分庫分表+讀寫分離+分散式系統+高可用+微服務架構)
高階部分
以上就是我全部的一個學習路線的規劃了,從整體的一個知識體系出發,梳理全部的知識,有漏洞就去查閱我相關的手寫筆記加以鞏固,最後上面試刷題,爭取查漏補缺,下次面試不再出現這麼多的不知道和知識空白。
話說到這裡,不論是知識體系大綱,還是相關的併發程式設計、效能調優、Spring全家桶、快取資料庫、分散式&微服務等等的筆記,如何你也想學習或者複習一下,那便可直接來找小編分享就行。
免費獲取文章資料方式:一鍵三連後“加我VX小助理”即可免費獲取到!
相關文章
- 嵌入式方向的畢業生,找工作很迷茫
- 騰訊泛工業化後臺開發面試問題彙總面試
- 最近去騰訊面試了,分享一波面試題面試題
- java面試題-大學畢業必看Java面試題
- Java 後端 100多道面試題,多看點題,沒壞處!Java後端面試題
- 2020畢業後我所經歷的面試【面試系列】 面試題四面試題
- 騰訊技術崗位筆試&面試題(一)筆試面試題
- web前端工程師面試題更新了,找工作必背的面試題 一Web前端工程師面試題
- 騰訊社招筆面試題面試題
- 騰訊前端二面手寫面試題前端面試題
- 乾貨面經 | 初中級爬蟲工程師面試指北 - 畢業工作一年薪資翻番了爬蟲工程師面試
- 找工作面試時要問的事,大學生必看面試
- 害怕面試被問HashMap?這一篇就搞定了!面試HashMap
- 騰訊前端一面經典手寫面試題合集前端面試題
- 面試了一個 39 歲程式設計師後,我被罵了……面試程式設計師
- 70個經典面試問題,有備無患~面試
- 從阿里、騰訊的面試真題中總結了這11個Redis高頻面試題阿里Redis面試題
- 迎戰2021年春招,面試螞蟻金服,京東,騰訊等六家大廠的面試經驗分享!(附300多道面試真題)面試
- 騰訊一面:記憶體滿了,會發生什麼?記憶體
- “我,95後,畢業七年換了3份軟體測試工作”,工資翻倍了……
- 邦芒面試:面試99%會被問到的問題,你一定要知道面試
- 去騰訊面試了,我自信滿滿!面試
- 50道Redis面試題史上最全,以後面試再也不怕問Redis了Redis面試題
- 騰訊面試後續 | 掘金技術徵文面試
- IT專業大學生迷茫些什麼
- 面試阿里,位元組,騰訊90%被問到的springboot常見面試題,這次給你講的明明白白!阿里Spring Boot面試題
- 騰訊往屆筆試面試題整理大全筆試面試題
- 面試必問:訊號量與生產者消費者問題!面試
- 被騰訊問蒙的各種Redis複雜問題Redis
- Java面試必問面試題,你掌握了嗎?Java面試題
- 面臨畢業的計算機專業學生,怎樣去學習web前端,哪些是面試要點計算機Web前端面試
- 裸辭兩個月,4面終入職騰訊,半年後我終於把騰訊 Android 高頻面試真題及解析整出來了Android面試
- 一個ios程式設計師年後找工作經歷(附上一些面試問題)iOS程式設計師面試
- 2020年騰訊實習生C++面試題&持續更新中(3)C++面試題
- 騰訊技術崗位筆試&面試題(二)筆試面試題
- 面試常遇的打家劫舍問題你學會了嗎~面試
- 2018 年騰訊前端一面總結(面向 2019 屆學生)前端
- 騰訊這套SpringMvc面試題你懂多少(面試必備)SpringMVC面試題