spring相關(guān)面試題
- IOC和AOP的理解
- 了解過spring單例bean的線程安全問題嗎
- springMVC的工作原理,---重點提到DispatcherServlet
- spring事物的方式,事物級別和傳播行為--編程式事物、聲明式事物
springboot相關(guān)面試題
遺漏
redis
redis 內(nèi)部數(shù)據(jù)接口 ---> redisObject
-
redis應(yīng)用場景
- string 緩存、計數(shù)器、分布式鎖
- map 緩存對象 ziplist、hashtable
- list 緩存文章列表、消息等 ziplist和linkedlist,quicklist
- set 緩存一些標(biāo)簽 intset(數(shù)組)和hashtable
- zset 延時隊列、排行榜 ziplist、skiplist
redis使用的一致性算法
-
redis分布式鎖有什么問題
- 獲取鎖,使用lua或者事務(wù)來進(jìn)行cas操作
- 刪除鎖時有可能刪除別人的鎖 --- 使用當(dāng)前線程作為value值進(jìn)行加鎖,在刪除時先判斷再刪除(這個解鎖的操作作為一個事務(wù)Lua)
- 有可能導(dǎo)致死鎖 --- 增加超時機(jī)制
- 超時機(jī)制可能導(dǎo)致業(yè)務(wù)和鎖釋放時間不一致
使用定時任務(wù)不斷更新超時時間 - 高可用鎖如何實現(xiàn),比如主從結(jié)構(gòu),主節(jié)點失效?
- 可疑考慮zookeeper
- 可以
Rlock redissonLock=redisson.getLock(lockKey); try{ }
虛擬機(jī)部分
G1垃圾回收器優(yōu)點
-
CMS垃圾回收器的回收過程
- 初始標(biāo)記 stw
- 并發(fā)標(biāo)記 ---- 有可能存在沒有命中的垃圾
- 重新標(biāo)記 stw
- 清除 --- 因為不是復(fù)制算法,所以存在很多碎片,可能導(dǎo)致fullGC
myisam
內(nèi)核態(tài)和用戶態(tài)
kafka部分
- kafka的業(yè)務(wù)上冪等性如何實現(xiàn)?
- kafka 事務(wù)的原理
tcp/http
tcp 所用到的算法,擁塞控制
netty工作線程源碼
hashmap的擴(kuò)容機(jī)制
epoll和select的區(qū)別,紅黑樹的作用是什么
-
epoll的調(diào)用流程:
- epoll_create 創(chuàng)建一個句柄
- epoll_ctl 注冊事件,更新或者刪除
- epoll_wait 獲取新的事件
為什么更快:
- 底層維護(hù)了一棵紅黑樹來保存這些socket,而不是像poll或select那樣每次執(zhí)行,都會傳入一個數(shù)組
- 另外維護(hù)了一個list來保存動態(tài)的事件,最開始我們在內(nèi)核中斷中注冊一個回調(diào)函數(shù),當(dāng)對應(yīng)發(fā)生中斷時,就會把它放到這個就緒list當(dāng)中,每當(dāng)epoll_wait 調(diào)用時僅僅把這個list復(fù)制即可
滑動窗口和擁塞控制
每個socket讀寫的時候內(nèi)部都會維護(hù)一個發(fā)送以及接收的緩沖區(qū),
java
- 什么是cpu密集型、什么是io密集型
- concurrentHashMap為什么不支持null----因為有二義性,單線程可以通過get,再contains來判斷,但是多線程情況下,這兩個操作之前可能因為并發(fā)導(dǎo)致結(jié)果不一致
- synchronize和lock的區(qū)別
- synchronize,可以用在代碼塊和方法上,編程更簡潔
- synchronize在異常時會自動釋放鎖,而lock必須要在finally塊中釋放,不然會死鎖
- Lock可以中斷響應(yīng)
- Lock功能更多更靈活,可以知道有沒有成功獲取鎖,可以使用tryLock,快速反饋
- Lock可以支持公平和非公平,而synchronize只支持非公平
- Lock還提供了condition
- volatile原理:緩存一致性協(xié)議,volatile關(guān)鍵字前有l(wèi)ock前綴,相當(dāng)于一個內(nèi)存屏障
- 確保不會把它后面的指令放到前面
- 會強(qiáng)制把對緩存的修改理解寫入內(nèi)存
- 如果是寫操作,會導(dǎo)致其他CPU中對應(yīng)的緩存行失效
- synchronize 原理
- 每個對象頭部存儲了鎖信息
- synchronized是一個重量級鎖,其中指針指向了monitor對象,每個對象都有一個monitor與之關(guān)聯(lián)
- monitor類,有一個waitSet、blocklist以及owner
- 代碼塊中字節(jié)碼指令會有monitorenter和monitorexit指令,而方法中則ACC_SYNCHRONIZED來控制
- 第一次訪問時偏向鎖,后面有新線程訪問,則升級為輕量鎖,再升級為互斥鎖
spring cloud
- eureka 自我保護(hù)機(jī)制、服務(wù)注冊與發(fā)現(xiàn)
- 負(fù)載均衡
- 限流 redis 分布式限流如何實現(xiàn)---- Lua腳本進(jìn)行 cas操作
- spring中resource 注解和 autowired區(qū)別:
- Autowired是按類型裝配,而resouce是默認(rèn)按照名稱
- Resource是jdk的注解,而Autowired是Spring提供的
數(shù)據(jù)庫
- timestamp和datetime的區(qū)別,timestamp是4個字節(jié),到2037年,適用于記錄最后修改的時間datetime,與時區(qū)無關(guān),適合原始時間的記錄,且記錄時間無限制,int存儲可以使用between,查詢更快
- 如何保證redis和數(shù)據(jù)庫的一致性,刪除緩存失敗的場景:
- 使用消息隊列,將刪除失敗的消息放入隊列,開啟線程刪除
- 定于數(shù)據(jù)庫中的binlog日志,在非業(yè)務(wù)中使用binlog來更新redis緩存