絮叨
說實話,能有機會面一下阿裡對我來說幫助确實有蠻多,至少讓我知道了自己的不足在哪,都說面試造火箭,上班擰螺絲。但就算是如此,為了生存,你也隻有不停的學習,唯有光頭,才能更強。哈哈
起因
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來分鐘,但是也是完成沒有搞懂再幹嘛:
最後隻能選擇放棄: