前言
文字已收錄至我的GitHub倉庫,歡迎Star:github.com/bin39232820…
種一棵樹最好的時間是十年前,其次是現在
我知道很多人不玩qq了,但是懷舊一下,歡迎加入六脈神劍Java菜鳥學習群,群聊號碼:549684836 鼓勵大家在技術的路上寫部落格
絮叨
說實話,能有機會面一下阿里對我來說幫助確實有蠻多,至少讓我知道了自己的不足在哪,都說面試造火箭,上班擰螺絲。但就算是如此,為了生存,你也只有不停的學習,唯有光頭,才能更強。哈哈
起因
2月28日在Boss上,有個阿里的大佬找我打招呼說可以幫我內推,我想也沒想就把簡歷給它了,然後就一直忘記這事了。因為我覺得我一個垃圾學校的小垃圾,怎麼會有面試機會,虧人家還讓我準備一下,我也拋到九霄雲外了。
然後也收到了阿里的內推訊息
開始第一輪電話面
然後在3月4號的晚上8點鐘(看來阿里的工作時間確實長,我估計面試也是他們kpi的一部分吧),一個來自杭州的陌生電話打過來
面試官
xxx,你好,我是杭州阿里巴巴xxx的,我想問你現在有沒有時間,我來簡單的給你做個面試,你這邊先來個自我介紹
我
當時我還沒意識到是內推,因為我早已經忘的差不多了,還以為是啥新的炸騙方式,直到他說它是來給我面試的,然後說有人內推過我的簡歷,我這才想起幾天前的事情。然後我巴拉巴拉的做了一個傳統的自我介紹,就是那些套路,之類的,然後面試官開始問問題了
面試官
你對多執行緒瞭解嗎,說說你對Synchronized和lock,說說他們之間的區別我
其實這個問題,應該算是很基礎的問題了,我就說了一下,一個樂觀鎖,一個是悲觀鎖,然後說了一下Synchronized的鎖升級的過程(這個還行我自己覺得),然後我說了一下 Synchronized 鎖方法 ,靜態方法,同步程式碼塊的一些區別(這個點其實我沒答上來,有點忘記了。就是在JVM裡面的標記位不同的區別),然後是lock這點我也沒答上,這個應該說他的幾個實現,然後跟面試官聊聊他的底層實現原理,但是我這個是目前真的不是很熟悉,因為平時不用,可能前面走馬觀花的看了,但是這次面試是突擊,所以真的對於lock就是知道他是aqs實現的具體的全忘記了
面試官
然後面試官說lock不熟,沒事,那你還有沒有用過什麼東西來保證執行緒安全
我
然後突然想到了一下CAS,然後說了一下CAS,這個我感覺說的7788吧,至少怎麼保證安全的我說出來,先在本地執行緒記錄原來的值和計算之後的值,去刷到主存的時候,先比較原來的值。但是他讓我說底層原來的時候,我又好像說錯了,我把他和voliate搞混了,我竟然說是因為有一個記憶體匯流排,真的是尷尬呀,能夠說讓其他的本地執行緒無效,在Cpu層面(這就是那種靠背的結果,哎),其實CAS的底層是一個lock指令來實現的再多核系統中,反正就這樣扯。。被我扯到了分散式鎖。。。我感覺自己拉開話題的技術還是可以的,哈哈
面試官
你說你們公司用的redisson來實現分散式鎖,如果不用redisson你能實現分散式鎖嘛,自己用redis,或者你給我說說redission是怎麼實現分散式鎖的
我
當時我就在想,我怎麼把自己從一個坑,挖到另外一個坑,因為redisson的底層原始碼,我是真的沒看,這個我是真說不出來,然後我就說怎麼實現分散式鎖,用exist 和 setNX命令,還有加超時時間,然後用lua指令碼做成一個原子性操作,來實現一個分散式鎖,這個我以前自己做過demo,然後現在手寫不出來,但是至少做過,印象還是深點。然後我就搭了一下,然後他又說,那你還有什麼方法保證原子性呢?我其實也不清楚他想問的是啥,我就隨便搭了個事務。。。。
面試官
我看你對redis 蠻熟悉的,那我們就來聊聊redis,說說他的資料結構
我
我靠,終於來了個會的了,嗶哩吧啦的說了一下,然後他又問了一些基礎的東西,比如說快取穿透這些,這些其實還好,畢竟自己有試過。
面試官
既然你對redis那麼熟悉,你知道為啥redis那麼快嘛
我
其實這個問題是為後面做鋪墊的,我搭 單執行緒 記憶體 IO多路複用,媽的這個IO多路複用我只是以前看書的時候看過,我根本還不是很熟悉這個東西,然後他就盯著這個問了。。。然後我就尷尬的一批。就沒問我了,可能知道了我的深度了吧,哈哈
面試官
那你對多執行緒方面的知識,還有哪些瞭解的,比如執行緒池,或者原子性的類這些
我
我心裡,一萬字曹尼瑪,又來多執行緒,然後我說了幾個我自己並不是很熟悉的原子類,然後聊到底層,又不會(還是太菜),然後聊執行緒池,然後聊執行緒池的建立,執行緒池的執行過程,然後他的優化啥的,然後聊了一下,感覺我也沒啥深度,就終於不再跟我聊多執行緒了,(目前為止,就聊了2個東西 redis和多執行緒,redis的東西,至少我感覺比多執行緒要好很多),然後面試官,又開始問了
面試官
我看你用的rabbitmq 說說你是如何保證訊息的可靠性的
我
這個其實還是很簡單,從傳送端就是 confirm機制,接收端就是用的ack機制,然後引用到我們自己專案用的Aop把失敗的訊息存到redis中,並通知相關負責人去處理,這樣,然後我來聊到了 我用它來做分散式事務的可靠訊息最終一致性,因為這些東西都是我自己引申過去說的,肯定是我比較會的,說到了如何去做它的冪等,防止重複消費,然後中間還插了一下rocketmq ,可惜我不是很熟悉,它裡面的事務機制,稍微說了下 然後說了一下它的持久化機制啥的,最後它問了一個啥問題,說假設你什麼都做到最好的情況下,怎麼樣才能更好的保證訊息的可靠,包括你的伺服器被炸了,斷點,啥的。。。完成不知道再問啥,然後mq就沒問了,其實看著說的簡單,但是實際聊的東西還是有點的,什麼死信佇列啥的都是有設計到的。
面試官
我看你對JVM調優有了解,我們聊聊JVM吧,然後因為垃圾回收演算法,垃圾回收器。
我
這個還好畢竟自己有看過這方面的知識,然後就把JVM的知識說了一遍,反正就是自己知道各種扯
面試官
說說你是怎麼定位線上問題的定位吧,比如說CPU 或者是記憶體
我
其實我這快沒怎麼實戰過,還是看過一些人家的解決方案,然後我就靠著記憶
Cpu:通過 top 命令找到 CPU 消耗最高的程式,並記住程式 ID。再次通過 top -Hp [程式 ID] 找到 CPU 消耗最高的執行緒 ID,然後找到執行緒ID是十進位制的,把他轉換成十六進位制,然後用jstack找到當前執行緒的jstack.log的快照,然後分析他的問題。
記憶體:其實對於記憶體的話無非就是2種一直是記憶體溢位,另外一種是記憶體不健康,就是記憶體洩露 記憶體溢位的情況可以通過加上 -XX:+HeapDumpOnOutOfMemoryError 引數,該引數作用是:在程式記憶體溢位時輸出 dump 檔案。 有了dump檔案,我們找問題就很簡單了,比如我們用MAT等等,找到原因 如果是記憶體洩露的話就得具體分析了 比如你的young GC的頻率,和Full GC的頻率 ,如果是和平時完全不一樣的話,我們也可以用MAT去分析一下看是否是每個物件佔用的記憶體特別大,並且還沒有回收他,然後找到這個物件去分析他的邏輯,並且來解決這種記憶體洩露的問題
面試官
聊聊mysql把,平時怎麼做查詢,優化
我
反正就是那些套路 什麼索引啥的,說到索引了,那你對b+數熟悉嗎,我。。。。又是挖坑給我,我擦。我就其實我不懂,我因為沒有準備去面試題。。。。唉(還是不能注重形式)
面試官
沒關係,我們來聊聊mysql的隔離級別
我
我又把那幾個背了一下(還好這個好記得,因為真的是死背的以前)
面試官
那你給我說說 可重複讀的底層實現原理嘛
我
我擦,又掉坑裡面去了。。。。唉我就只好說,還沒空去了解這塊
面試官
沒關係 我看你用的SpringCloud 聊聊他的元件吧
我
然後我有嗶嗶嗶啦 把這些基礎的 平時工作的這些分散式元件給他說了
面試官
那你給我說說 註冊中心怎麼保證自己的高可用的
我
其實這個還好,以前背過哈哈 我就把自己對2pc的選舉過程崩潰恢復,資料同步的過程扯了一遍
面試官
既然你對2pc 這麼熟悉。我給你個場景,你說說看這種情況怎麼處理,就是因為網路原因,出現了雙主問題。
我
我的內心的崩潰的,其實我都不知道再說啥了反正,不過有一點我是知道的,肯定是再瞎說,因為我自己也真不知道自己再說什麼了,然後只能說,這個不是很清楚
面試官
好點,沒事。那你說 對於分散式系統來說,除了我們經常說的2pc 3pc還有什麼更好的方法來做資料一致性
我
然後我又不知道要說啥了,又只能說不知道了
面試官
然後又問了下Spring ,對於Spring的一些原始碼的理解我
我靠,終於問到一個我會的了,然後我就Spring容器的初始化過程 和Spring單例bean的注入過程,和迴圈依賴講了一下。這個它竟然沒往死裡問我了,哈哈(看來平時看點原始碼還是有點用的)
面試官
你現在有電腦嗎,我們來做個機試吧,我
然後我說我沒帶電腦,我想著就說算了把,謝謝您的好意,我反正也過不了,然後它就再三約我明天晚上來做,我就說 沒有補全 我程式碼都寫不全的,但是它還是邀請我參加,我就只能答應了,然後就掛了電話
開始我的阿里第一次機試,估計也是最後一次(哈哈)
當時我跟這個面試官約的是3月5號 8點以後,看來再阿里工作也是蠻長時間的,但是人家工資高,哪裡像我們做的多,工資少,不過人家水平高,這個沒辦法
到了8點,面試官主動給我打了個電話,然後把機試題目發到了我郵箱,然後高速我看著我寫,我心理拔涼的,擔心啥也寫不來
然後題目其實很簡單 是力扣上的24題,但是我當時做的時候並不知道,我也不能百度,可惜我在那瞎寫寫了30來分鐘,但是也是完成沒有搞懂再幹嘛
最後只能選擇放棄
結束我的阿里面試旅程
結尾
哈哈,其實還是自己太菜了,雖然說我連一面都沒過(菜是原罪),但是這次面試給我的幫助還是很大,讓我在沒有準備的情況下知道了自己的水平,應該算是比較真實了把,還有一點就是我們工作中大都是CV大法,導致我很多的基礎程式碼都不是很會,基礎不紮實,雖然這個機試是演算法,但是我很多簡單程式碼沒有補全都不會,很多簡單工作的實現都是百度,導致自己的動手能力弱了很多。這點以後要改,我呢?把這次經歷分享給大家,希望大家要引以為戒。好好學習,紮實基礎。
日常求贊
好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是真粉。
創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文章見
六脈神劍 | 文 【原創】如果本篇部落格有任何錯誤,請批評指教,不勝感激 !