高德 面經(jīng)
一面
Java 基礎(chǔ) & 核心
- 你覺得用的比較熟練的技術(shù)棧/基礎(chǔ)中間件有哪些?(除了 Java 和 Spring/Spring Cloud Alibaba)還用到了其他的中間件嗎?消息隊列是 Kafka 嗎?
- Java 的多態(tài)是怎么實現(xiàn)的?(底層原理方面)
- Java 里面的泛型是什么?
- 類型擦除是個什么樣的機制?怎么理解這個東西?
- (泛型擦除后)聲明一個 List<Integer>,編譯完之后可以往里面放 String 類型嗎?為什么不能放?是誰控制的?
- 用過 Java 里面的反射沒?
- 反射有幾個基本的類是什么?(面試官提示“三駕馬車”,但候選人不清楚這個說法,后續(xù)追問具體類)
- 我們可以怎么獲得那個 Class 實例?(class.forName之外還有嗎?)
- 類名.class 是啥意思?
- 你了解過哪些場景比較適合用反射嗎?
- AOP 的兩種實現(xiàn)方式(JDK 和 CGLib)了解嗎?它們有什么區(qū)別?
- (提到 Byte Body)它基于是怎么實現(xiàn)的?那 CGLib 不也是基于字節(jié)碼嗎?為什么重新寫一個 Byte Body?它在哪方面優(yōu)化會變得更好?
Java 并發(fā) & 線程池
- Java 里面線程池創(chuàng)建的時候有幾個基本的參數(shù)?都有哪些?
- 什么時候拒絕策略會生效?
- (針對候選人實踐)為什么你們要把核心線程數(shù)和最大線程數(shù)設(shè)置成相等?是怕影響什么?(不讓擴容的原因)
- (針對候選人實踐)你們(核心=最大)不銷毀線程是嗎?最大的(線程數(shù))會有多大?
- (針對候選人實踐)你們是 CPU 密集型?沒有 IO 密集型?(查 RDB 也算 IO)
- (針對候選人實踐)你們沒有一點復(fù)雜點的場景嗎?(暗示業(yè)務(wù)簡單)
- 假設(shè)(需要)處理業(yè)務(wù)(IO密集型),你還會這么配(核心=最大)嗎?
- 如果有 IO 密集型,核心和最大不一樣,那你的拒絕策略什么時候生效呢?
- (舉例:核心4,最大9)來第五個任務(wù)的時候會怎么辦?
- 我想去實時的監(jiān)控這個線程池里面有多少處于活動的線程,可以怎么做?
- (如果讓你實現(xiàn)動態(tài)線程池/監(jiān)控)你有什么思路嗎?
- 線程池里面他怎么記錄有多少個線程的,你知道嗎?(Worker 類相關(guān))
JVM
- JVM 的運行時數(shù)據(jù)區(qū)域有哪些?
- 堆里面存什么東西?
- 那個虛擬機棧(虛擬基站)里面會存什么?
- (棧執(zhí)行流程)當執(zhí)行完 C 方法的時候,我怎么能找到 B 呢?
- 你們項目在發(fā)布運行過程中用的都是什么垃圾回收算法?(G1 還是 CMS)
- (如果用 CMS)為什么不統(tǒng)一用 G1?(追問 CMS 的問題,如參數(shù)調(diào)優(yōu)復(fù)雜、STW)
- G1 和 CMS 相比有什么優(yōu)勢?(可控的停頓時長)
- G1 能保證那個(最大回收)時長固定嗎?
Spring & Spring Boot
- Spring Boot 解決了什么問題?(區(qū)別于 Spring Framework)
- Spring 的 Bean 的生命周期有什么?(從產(chǎn)生到銷毀有哪些階段)
數(shù)據(jù)庫 (MySQL)
- MySQL 支持事務(wù)嗎?
- 事務(wù)的 4 大特性(ACID)是什么?
- 事務(wù)隔離級別有哪些?
- 幻讀是個什么現(xiàn)象?
- 剛才提到的那幾種隔離級別里面哪些會有幻讀,哪些沒有幻讀?
- SQL 里面的主從復(fù)制那個機制是什么樣子的?
- 為什么(主從復(fù)制)要讓從庫去向主庫請求(拉模式),而不是主庫向從庫去做廣播(推模式)?你覺得哪種會比較好一點?
- (如果用 MQ 類中間件轉(zhuǎn)發(fā) binlog)這種方式有什么問題?(如順序性、數(shù)據(jù)丟失、實時性、主庫無法感知同步狀態(tài)等)
緩存 (Redis)
- Redis 有哪些數(shù)據(jù)類型?
- 我想要實現(xiàn)一個可以按照時間范圍來查找訂單的結(jié)構(gòu),用 Redis 里面怎么來做?
- (用 Sorted Set 實現(xiàn)按時間范圍查找)只能用這種嗎?List 可以嗎?
- (如果用 List)一個 Key 會產(chǎn)生大 Key 問題,(如果不用 List)最好還是用 Sorted Set 會好點?
- 你用 Sorted Set 的話,它的查詢的復(fù)雜度是啥?(LogN 還是 NLogN 或 M+LogN)
算法 & 編程題
- 做一個支持權(quán)重的負載均衡的算法。(提供代碼框架,要求實現(xiàn) getHost 方法)
- (針對代碼實現(xiàn))來講一下你的思路。
- (針對代碼實現(xiàn))第 49 行,這里小于等于可以嗎?為什么?。S機數(shù)時)左閉右開區(qū)間?(追問邊界條件和小數(shù)精度問題)
二面
- 關(guān)于登錄態(tài) token 校驗?zāi)K:你能大概介紹一下你具體你們是怎么做的嗎?怎么保證它的這個高可用?
- 既然有了本地可以來做(token)解密校驗的話,還需要 Redis 嗎?
- 多端互踢是為了(什么)?為什么要有一個這樣的機制?
- 為什么不能讓他(用戶)多個渠道能同時登錄?
- 關(guān)于二級緩存(本地 Caffeine + Redis):這個具體是怎么做的?(第一層基于 ID,第二層具體實現(xiàn))
- 你們這個活動(查詢)的 QPS 大概有多高?
- 什么時候會查這個(活動)?它是什么場景觸發(fā)的查詢?
- 貨拉拉的下單(場景)有 7 萬的 QPS 嗎?(對候選人提供數(shù)據(jù)的確認/質(zhì)疑)
- 本地緩存存的是什么東西?
- 訂單 ID 跟活動 ID 的關(guān)聯(lián)關(guān)系也在本地緩存里存了嗎?
- Redis 里面也是存的同樣的結(jié)構(gòu)是吧?
- 你們有多少臺機器?本地緩存的命中率呢?
- (司機看單)每次都會查(活動)嗎?你們的上游(調(diào)用方)不會做緩存嗎?
- 一個訂單下面有那么多活動 ID,然后每個司機看到命中的活動還(會)不一樣嗎?
- (針對緩存優(yōu)化)用 get + 本地(緩存)代替 mget:為什么要做這個事情?
- 你覺得這個(get 代替 mget)有做優(yōu)化嗎?這個替換本身是合理的嗎?
- (用 get 查詢?nèi)笔?key)是串行的還是并行的?
- 那(如果 get 是)并行的,跟 mget(相比),那為什么不用 mget 呢?
- 你們這個接口 RT 減了 200 毫秒,是收益是從哪里來的?
- 你覺得它主要的收益點是(因為)你們的哪個優(yōu)化動作(降低了 200 毫秒)?
技術(shù)方法論 & 問題排查
- 當你接到一個新任務(wù),或者接觸一個新的模塊/系統(tǒng)時,你是怎么來著手做這個工作的?(可以結(jié)合活動模塊來說)
- (針對服務(wù)治理任務(wù))你梳理的那個系統(tǒng),你覺得有啥問題嗎?
- 你梳理超時時間,有總結(jié)出什么經(jīng)驗來?你覺得超時時間應(yīng)該怎么配合適嗎?
- (默認超時時間)500 毫秒怎么來的?
- 你覺得這個(500 毫秒超時)合理嗎?
基礎(chǔ)知識 & 對比
- 你們內(nèi)部的交互是用的 RPC 是吧?能大概講一下 RPC 跟 HTTP 的差別嗎?